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

Adding second legend to 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")

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

因此,虽然 colors/years 定义明确,但散点的大小却不是。

如何添加定义散点图大小含义的辅助或附加图例?

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

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

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

您需要自己创建第二个图例,即您需要创建一些艺术家来填充图例。在散点图的情况下,我们可以使用正常的 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()