簡體   English   中英

將第二個圖例添加到散點圖中

[英]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")

此代碼(包含我的數據)生成以下圖表:

具有單個傳奇的代表人物

因此,盡管顏色/年份的定義很清楚,但分散的大小卻沒有。

如何添加定義散點大小的二級或附加圖例?

您需要自己創建第二個圖例,即您需要創建一些藝術家來填充圖例。 在散射的情況下,我們可以使用法線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()

在此輸入圖像描述

請訪問http://matplotlib.org/users/legend_guide.html

它顯示了如何有多個圖例(大約一半),還有另一個示例顯示如何設置標記大小。

如果這不起作用,那么您還可以創建自定義圖例(最后一個示例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM