我正在使用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条线。但是,传说不见了。 The documentation不接受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 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()
关于python - 将图例添加到Seaborn点图中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42767489/