使用多个标签为单个数据帧调整图例 Seaborn 关节图

如何解决使用多个标签为单个数据帧调整图例 Seaborn 关节图

假设我有一个具有这种结构的 Pandas 数据框:

Column 1   Column2 Column3
x1         y1       0
x2         y2       0
x3         y3       1
x4         y4       1
x5         y5       1
          ....
x_n-1      y_n-1    5
x_n        y_n      5

我想创建一个联合图,根据 Column3 的值分配不同的颜色。我使用的命令是

h = sns.jointplot(x="Column1",y="Column2",data=data,hue="Column3")

所以我所有的点都有 6 种不同的颜色。上一条命令产生的图例带有标签“0”、“1”、...“5”,这些标签没有解释。我想要“label0”、“label1”等,而不是它们。

我尝试使用以下命令:

h.ax_joint.legend([data.loc[data['Column3'] == 0],data.loc[data['Column3'] == 1],data.loc[data['Column3'] == 2],data.loc[data['Column3'] == 3],data.loc[data['Column3'] == 4],data.loc[data['Column3'] == 5]],['label0','label1','label2','label3','label4','label5'])

但是执行它我有以下消息:

A proxy artist may be used instead. See: https://matplotlib.org/users/legend_guide.html#creating-artists-specifically-for-adding-to-the-legend-aka-proxy-artists

当然,它不再绘制任何图例了。我一直在查看建议的文档,但我不知道如何改进它。有人有想法吗?提前致谢!

解决方法

最简单也是最符合 Seaborn 精神的方法是(暂时)重命名色调列的标签:

import seaborn as sns
import pandas as pd
import numpy as np

data = pd.DataFrame({"Column1": np.random.randn(36) * 10,"Column2": np.arange(36) % 6 + np.random.randn(36) / 4,"Column3": np.arange(36) % 6})
labels = ['label0','label1','label2','label3','label4','label5']
g = sns.jointplot(data=data.replace({"Column3": {i: label for i,label in enumerate(labels)}}),x="Column1",y="Column2",hue="Column3",palette="turbo")
g.ax_joint.invert_yaxis()

sns.jointplot with changed legend

另一种选择是再次创建图例并提供新标签。第二个图例将替换默认图例。如果您还想更改其他属性(例如图例的位置或删除其标题),这会很有用:

g = sns.jointplot(x="Column1",data=data,palette="turbo")
handles,labels = g.ax_joint.get_legend_handles_labels()
g.ax_joint.legend(handles=handles,labels=['label0','label5'],title="Column3")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?