【问题标题】:Adding second legend to scatter plot在散点图中添加第二个图例
【发布时间】:2017-05-05 19:59:51
【问题描述】:

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

我编写了以下生成散点图的代码。散点的颜色代表年份(取自用户定义的 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")

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

因此,虽然颜色/年份定义得很好且清晰,但散布的大小却不是。

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

【问题讨论】:

标签: python pandas matplotlib scatter-plot


【解决方案1】:

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

【讨论】:

  • 快速提问 - 在您发布的示例中,您已经创建了次要图例(质量)的范围和描述。如果数据既是连续的又是未知的,有没有办法创建这个轴的可视化?理想情况下,将最小值和最大值作为起点和终点,并在两者之间进行一些划分,但我不确定如何执行此操作。
  • [plt.plot([],[], color="gray", marker="o", ms=i, ls="")[0] for i in np.arange(min, max, division)]
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2017-10-14
    • 2015-10-11
    • 2021-12-14
    相关资源
    最近更新 更多