添加axhline到图例中。

19

我正在使用Seaborn从数据框创建一个折线图,想要在图中添加一条水平线。这个目标已经实现了,但是我遇到了一个问题:无法将水平线添加到图例中。

以下是一个最小化的、可验证的示例:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

x = np.array([2, 2, 4, 4])
y = np.array([5, 10, 10, 15])
isBool = np.array([True, False, True, False])

data = pd.DataFrame(np.column_stack((x, y, isBool)), columns=["x", "y", "someBoolean"])
print(data)

ax = sns.lineplot(x="x", y="y", hue="someBoolean", data=data)

plt.axhline(y=7, c='red', linestyle='dashed', label="horizontal")

plt.legend(("some name", "some other name", "horizontal"))

plt.show()

这导致了以下的图表:

错误的图表

“some name”和“some other name”的图例显示正确,但是“horizontal”的图例为空白。我尝试只使用plt.legend(),但图例包含数据集中似乎是随机的值。

有什么想法吗?


你能把这个变成一个 [mcve] 吗?也就是说,能加入一些虚假数据吗? - DavidG
当然,我现在已经编辑了问题。 - maaland
1个回答

24

使用plt.legend()可以告诉您正在绘制的数据:

enter image description here

您正在使用someBoolean作为hue,因此通过对数据应用布尔掩码,您实际上正在创建两条线。一条线是用于假值的(在上面的图例中显示为0),另一条线是用于真值的(在上面的图例中显示为1)。

为了获得所需的图例,您需要设置handles和labels。您可以使用ax.get_legend_handles_labels()获取它们的列表。然后确保省略第一个handle,因为如上所示,它没有artist:

ax = sns.lineplot(x="x", y="y", hue="someBoolean", data=data)

plt.axhline(y=7, c='red', linestyle='dashed', label="horizontal")

labels = ["some name", "some other name", "horizontal"]
handles, _ = ax.get_legend_handles_labels()

# Slice list to remove first handle
plt.legend(handles = handles[1:], labels = labels)
这将产生:

输入图像描述


如何在调用plt.axhline时立即排除? - droid192
2
为了让它对我起作用,我不得不将axhline对象追加到handles中。即handles.append(plt.axhline(y=7, c='red', linestyle='dashed', label="horizontal") - Hawklaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接