New*_*t14 2 python matplotlib scatter-plot pandas
有没有一种方法可以向散点图的大小与某些数据成比例的散点图添加辅助图例?
我写了下面的代码来生成散点图。散点图的颜色表示年份(取自用户定义的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")
Run Code Online (Sandbox Code Playgroud)
此代码(包含我的数据)产生以下图形:
因此,虽然对颜色/年份进行了很好的明确定义,但分散的大小却没有。
如何添加辅助或附加图例来定义散点图的大小?
您将需要自己创建第二个图例,即您需要创建一些艺术家来填充图例。对于散点图,我们可以使用法线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()
Run Code Online (Sandbox Code Playgroud)