Pandas散点图使用数据帧字段导出颜色和图例

2024-09-28 21:59:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个散点图,显示pandas中的两个列相互映射,第三列是大小,然后是基于标签的点的颜色(在下面的例子中,是姓氏)。在

然后我想要一个图例,显示一个点的颜色,然后最后的名称值

每个姓氏应与不同的颜色相关联,图例显示,例如,绿点和米勒,红点和雅各布森等

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
    'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
    'female': [0, 1, 1, 0, 1],
    'age': [42, 52, 36, 24, 73],
    'preTestScore': [4, 24, 31, 2, 3],
    'postTestScore': [25, 94, 57, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'female', 'preTestScore', 'postTestScore'])

plt.scatter(df.preTestScore, df.postTestScore, s=df.age, label=df.last_name)
plt.legend(loc='upper left', prop={'size':6}, bbox_to_anchor=(1,1),ncol=1)

这给了我这样的感觉:

enter image description here

我根本不知道怎么把颜色调进去(理想情况下,我想用调色板),或者怎么让图例显示姓氏和圆点

任何帮助都将不胜感激。。谢谢!在

注意-我从这里举一个例子Chris Albon。在


Tags: nameimportpandasdfagematplotlib颜色as
2条回答

调用scatter将只生成一个图例项。如果要为每个点指定图例项,最简单的方法是为每个点调用绘图方法。这不应该是一个性能方面的问题,因为您不希望在您的图例中有数千个条目。我将使用plot,因为它对一个点很好,但是如果你需要更漂亮的效果,你也可以使用scatter。在

for _, row in df.iterrows():
    plt.plot(row.preTestScore, row.postTestScore, 'o', ms=np.sqrt(row.age),
             label=row.last_name)
plt.legend(loc='upper left', bbox_to_anchor=(1,1))

enter image description here

我还不知道怎么把传说中的圆点做成同样大小,我不确定这是否是你想要的。我认为不同的尺寸看起来不错,可以帮助定位在情节中的人。在

或者,您可以只使用一个对scatter的调用,然后检查返回的PathCollection的属性并手工构建图例,但我认为我的方法更简洁。在

首先,为了产生颜色,您可以在数据帧中添加一个带颜色的列。然后这些颜色可以传递给c的关键字参数scatter。在

创建带有不易访问的条目的图例的常见解决方案是generate proxy artists。在本例中,我们将创建一组不同颜色的标记,并将其提供给handles参数的legend。图例标签就是数据帧中的最后一个姓。在

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
    'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
    'female': [0, 1, 1, 0, 1],
    'age': [42, 52, 36, 24, 73],
    'preTestScore': [4, 24, 31, 2, 3],
    'postTestScore': [25, 94, 57, 62, 70],
    'colors' : ["r", "g", "b", "k", "cyan"]} # add a column for colors
df = pd.DataFrame(raw_data, 
     columns = ['first_name', 'last_name', 'age', 'female', 'preTestScore', 'postTestScore', "colors"])

#supply colors as argument for c
plt.scatter(df.preTestScore, df.postTestScore, s=df.age, c=df.colors) 
# generate proxy artists for legend
handles = [matplotlib.lines.Line2D([],[], marker="o", color=c, linestyle="none") for c in df.colors.values]
# supply proxy artists to handles and last names to labels
plt.legend(handles=handles, labels=list(df.last_name.values), 
           loc='upper left', prop={'size':6}, bbox_to_anchor=(1,1),ncol=1, numpoints=1)
plt.subplots_adjust(right=0.8)
plt.show()

enter image description here

相关问题 更多 >