将 axhline 添加到图例
回答问题 我正在使用 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
·
回答问题
我正在使用 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()
这导致以下情节:
“某个名称”和“某个其他名称”的图例正确显示,但“水平”图例只是空白。我尝试简单地使用plt.legend()
但随后图例由数据集中看似随机的值组成。
有任何想法吗?
Answers
只需使用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)
这给出了:
更多推荐
已为社区贡献126473条内容
所有评论(0)