将axhline添加到图例

maa*_*and 3 python matplotlib seaborn

我正在从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()
Run Code Online (Sandbox Code Playgroud)

结果如下图:

不正确的情节

“某些名称”和“某些其他名称”的图例正确显示,但“水平”图例只是空白。我尝试简单地使用, plt.legend()但图例由数据集中看似随机的值组成。

有任何想法吗?

Dav*_*idG 6

只需使用即可plt.legend()告诉您正在绘制哪些数据:

在此处输入图片说明

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

为了获得图例,您需要设置手柄和标签。您可以使用获取它们的列表ax.get_legend_handles_labels()。然后确保省略第一个没有艺术家的手柄,如上所示:

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)
Run Code Online (Sandbox Code Playgroud)

这给出:

在此处输入图片说明

  • 为了使这项工作对我有用,我必须将 axhline 对象附加到句柄。即 `handles.append(plt.axhline(y=7, c='red', linestyle='dashed', label="horizo​​ntal") (3认同)