将第二个图例添加到散点图中

时间:2017-05-05 19:59:51

标签: python pandas matplotlib scatter-plot

有没有办法在散点图中添加辅助图例,散点图的大小与某些数据成正比?

我编写了以下代码来生成散点图。散点图的颜色代表年份(取自用户定义的df),而散点图的大小代表变量3(也取自df但是原始数据):

import pandas as pd 

colors = pd.DataFrame({'1985':'red','1990':'b','1995':'k','2000':'g','2005':'m','2010':'y'}, index=[0,1,2,3,4,5])

fig = plt.figure()
ax = fig.add_subplot(111)

for i in df.keys():
    df[i].plot(kind='scatter',x='variable1',y='variable2',ax=ax,label=i,s=df[i]['variable3']/100, c=colors[i])

ax.legend(loc='upper right')
ax.set_xlabel("Variable 1")
ax.set_ylabel("Variable 2")

此代码(包含我的数据)生成以下图表:

Representative figure with single legend

因此,虽然颜色/年份的定义很清楚,但分散的大小却没有。

如何添加定义散点大小意味着什么的辅助或附加图例?

2 个答案:

答案 0 :(得分:3)

查看http://matplotlib.org/users/legend_guide.html

它显示了如何生成多个图例(大约一半),还有另一个示例显示如何设置标记大小。

如果这不起作用,那么您也可以创建自定义图例(最后一个示例)。

答案 1 :(得分:3)

您需要自己创建第二个图例,即您需要创建一些艺术家来填充图例。在分散的情况下,我们可以使用普通plot并相应地设置标记。 这在以下示例中显示。要实际添加第二个图例,我们需要将第一个图例添加到轴,以便新图例不会覆盖第一个图例。

import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np; np.random.seed(1)
import pandas as pd
plt.rcParams["figure.subplot.right"] = 0.8
v = np.random.rand(30,4)
v[:,2] = np.random.choice(np.arange(1980,2015,5), size=30)
v[:,3] = np.random.randint(5,13,size=30)

df= pd.DataFrame(v, columns=["x","y","year","quality"])
df.year = df.year.values.astype(int)
fig, ax = plt.subplots()
for i, (name, dff) in enumerate(df.groupby("year")):
    c = matplotlib.colors.to_hex(plt.cm.jet(i/7.))
    dff.plot(kind='scatter',x='x',y='y', label=name, c=c, 
             s=dff.quality**2, ax=ax)

leg = plt.legend(loc=(1.03,0), title="Year")
ax.add_artist(leg)
h = [plt.plot([],[], color="gray", marker="o", ms=i, ls="")[0] for i in range(5,13)]
plt.legend(handles=h, labels=range(5,13),loc=(1.03,0.5), title="Quality")
plt.show()

enter image description here