添加图例到Seaborn点图

Spa*_*att 20 python matplotlib python-3.x seaborn

我正在使用绘制多个数据帧作为点图seaborn.此外,我正在绘制同一轴上的所有数据帧.

如何在情节中添加图例?

我的代码获取每个数据框并在同一图上一个接一个地绘制它.

每个数据框都有相同的列

date        count
2017-01-01  35
2017-01-02  43
2017-01-03  12
2017-01-04  27 
Run Code Online (Sandbox Code Playgroud)

我的代码:

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

这在同一图上绘制了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')
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种方法可以为代码创建一个图例,该图例首先将点图顺序添加到图中,然后添加图例.

样本输出:

Seaborn图像

Imp*_*est 26

我建议不要用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果一个人仍然有兴趣获得点图的图例,这里有一个方法:

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

  • 好的,所以如果您真的对使用点图感兴趣,我添加了一种方法来获取这些图例。 (3认同)
  • @exhuma `pointplot` 为每次调用创建 `len(df)` 短错误行和一条主线。使用 `[::len(df1)+1] ` 您只选择主线,而不是错误线(它们都具有相同的颜色)。 (2认同)

Ada*_*m B 13

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

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

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

  • 但是,对于此解决方案,所有图例条目的图例颜色均为“蓝色”,而不是“蓝色”,然后是“绿色”,然后是“红色” (10认同)
  • 我用的时候没有! (2认同)

小智 6

我尝试使用 Adam B 的答案,但是,它对我不起作用。相反,我找到了以下将图例添加到点图中的解决方法。

import matplotlib.patches as mpatches
red_patch = mpatches.Patch(color='#bb3f3f', label='Label1')
black_patch = mpatches.Patch(color='#000000', label='Label2')
Run Code Online (Sandbox Code Playgroud)

在点图中,可以按照前面的答案中提到的方式指定颜色。一旦设置了对应于不同地块的这些补丁,

plt.legend(handles=[red_patch, black_patch])
Run Code Online (Sandbox Code Playgroud)

图例应该出现在点图中。