matplotlib 如何自定义彩色散点图图例句柄[重复]

tkclm6bt  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(139)

这个问题已经有答案了

How to change scatterplot hue legend handles(1个答案)
上个月关门了。
我有一个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”标记仍然是原来的样子:十字架,圆形,等等。我不希望改变。
我得到的vs我想得到的:

我检查了seaborn scatterplotmatplotlib markers的文档,都没有用。

ogsagwnx

ogsagwnx1#

您需要手动更改图例,这里图例中的每一行都是自定义项目,因此我们需要更改项目[1, 2, 3]

ax = sns.scatterplot(data=df, x="x", y="y", hue="Set", style="Test_Type")

# get current legend's handles and labels
handles, labels =  ax.get_legend_handles_labels()

# modify items 1, 2, 3
change = [1, 2, 3]
for i in change:
    handles[i] = plt.Line2D([], [], color=handles[i].get_facecolor(),
                            marker='s', linestyle='')
# update the legend
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 keep:   # if the label is in the column change to square
        handles[i] = plt.Line2D([], [], color=handles[i].get_facecolor(),
                                marker='s', linestyle='')
ax.legend(handles, labels)

输出量:

相关问题