将图例添加到 Seaborn 点图

新手上路,请多包涵

我正在使用 seaborn 将多个数据帧绘制为点图。我也在 同一轴上 绘制所有数据帧。

我将如何在情节中添加图例?

我的代码获取每个数据帧并将其一个接一个地绘制在同一个图形上。

每个数据框都有相同的列

date        count
2017-01-01  35
2017-01-02  43
2017-01-03  12
2017-01-04  27

我的代码:

 f, ax = plt.subplots(1, 1, figsize=figsize)
x_col='date'
y_col = 'count'
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_1,color='blue')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_2,color='green')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_3,color='red')

这在同一图上绘制了 3 条线。然而传说不见了。 该文档 不接受 label 参数。

一种可行的解决方法是创建一个新的数据框并使用 hue argument

 df_1['region'] = 'A'
df_2['region'] = 'B'
df_3['region'] = 'C'
df = pd.concat([df_1,df_2,df_3])
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df,hue='region')

但我想知道是否有一种方法可以为首先向图中添加顺序点图然后添加图例的代码创建图例。

示例输出:

Seaborn 图片

原文由 Spandan Brahmbhatt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我建议不要使用 seaborn pointplot 进行绘图。这使事情变得不必要地复杂化。

而是使用 matplotlib plot_date 。这允许为绘图设置标签,并使用 ax.legend() 自动将它们放入图例中。

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

date = pd.date_range("2017-03", freq="M", periods=15)
count = np.random.rand(15,4)
df1 = pd.DataFrame({"date":date, "count" : count[:,0]})
df2 = pd.DataFrame({"date":date, "count" : count[:,1]+0.7})
df3 = pd.DataFrame({"date":date, "count" : count[:,2]+2})

f, ax = plt.subplots(1, 1)
x_col='date'
y_col = 'count'

ax.plot_date(df1.date, df1["count"], color="blue", label="A", linestyle="-")
ax.plot_date(df2.date, df2["count"], color="red", label="B", linestyle="-")
ax.plot_date(df3.date, df3["count"], color="green", label="C", linestyle="-")

ax.legend()

plt.gcf().autofmt_xdate()
plt.show()

在此处输入图像描述


如果仍然对获取点图的图例感兴趣,可以采用以下方法:

 sns.pointplot(ax=ax,x=x_col,y=y_col,data=df1,color='blue')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df2,color='green')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df3,color='red')

ax.legend(handles=ax.lines[::len(df1)+1], labels=["A","B","C"])

ax.set_xticklabels([t.get_text().split("T")[0] for t in ax.get_xticklabels()])
plt.gcf().autofmt_xdate()

plt.show()

原文由 ImportanceOfBeingErnest 发布,翻译遵循 CC BY-SA 3.0 许可协议

老问题,但有一个更简单的方法。

 sns.pointplot(x=x_col,y=y_col,data=df_1,color='blue')
sns.pointplot(x=x_col,y=y_col,data=df_2,color='green')
sns.pointplot(x=x_col,y=y_col,data=df_3,color='red')
plt.legend(labels=['legendEntry1', 'legendEntry2', 'legendEntry3'])

这使您可以按顺序添加绘图,而不必担心除了定义图例项之外的任何 matplotlib 废话。

原文由 Adam B 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题