我有一个seaborn散点图,其中的数据点通过(1)颜色和(2)标记来区分。这是生成绘图的最少代码:
d = {'x': [1, 2, 3, 4], 'y': [2,4,6,8], 'Set': ["Set 1", "Set 1 ", "Set 2", "Set 2"], "Test_Type": ["Direct", "Natural","Direct", "Natural"]}
df=pd.DataFrame(data=d, index=[0, 1, 2, 3])
sns.scatterplot(data=df, x="x", y="y", hue="Set", style="Test_Type")
plt.axis(ymin=0)
plt.xlabel("x values")
plt.ylabel("y values")
plt.legend()
plt.show()
“Set”图例标记是圆形(根据数据框中的“Set”列着色),但我希望它们是不同的东西,比如正方形。当然,我希望“Test_Type”标记仍然是原来的样子:十字、圆圈等等。我不想改变这一点。
我得到的与我想要得到的:
我检查了 seaborn scatterplot 和 matplotlibmarkers 文档,但无济于事。
您需要手动更改图例,这里图例中的每一行都是自定义项目,因此我们需要更改项目
[1, 2, 3]
:
ax = sns.scatterplot(data=df, x="x", y="y", hue="Set", style="Test_Type")
handles, labels = ax.get_legend_handles_labels()
change = [1, 2, 3]
for i in change:
handles[i] = plt.Line2D([], [], color=handles[i].get_facecolor(),
marker='s', linestyle='')
ax.legend(handles, labels)
您还可以从列名称中自动识别所需的标签:
ax = sns.scatterplot(data=df, x="x", y="y", hue="Set", style="Test_Type")
handles, labels = ax.get_legend_handles_labels()
# get unique labels
keep = set(df['Set'])
# {'Set 1', 'Set 1 ', 'Set 2'}
for i, l in enumerate(labels):
if l in labels:
handles[i] = plt.Line2D([], [], color=handles[i].get_facecolor(),
marker='s', linestyle='')
ax.legend(handles, labels)
输出: