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

问题描述:

我想创建一个散点图,其中显示了在熊猫中彼此映射的两列,大小的三分之一以及基于标签点的颜色(在下面的情况,姓氏)。熊猫散点图使用数据帧字段导出颜色和图例

然后,我希望有一个传说,显示的颜色,然后

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

%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为例。

+0

可以分配每一个点不同的颜色与颜色的列表:'[ 'R', 'B', 'G', 'K', 'Y']'。我不知道如何安排图例,以便每个人都有自己的排名,但是不会通过一系列的标签。你可以做一个循环,并调用散布图5次不同的时间,这将得到你想要的情节。 –

+0

这里实际上有一个类似的问题:http:// *。com/questions/16614558/legend-using-pathcollections-in-matplotlib – ImportanceOfBeingErnest

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的属性并手动创建图例,但我认为我的方法更清晰。

+1

为了让图例中的点大小相同,您可以调整图例中手柄的大小,如下所示:handles = plt.gca()。get_legend_handles_labels ()[0]; [handle.set_markersize(10)for handle in handles]; plt.legend(handles = handles)' – ImportanceOfBeingErnest

首先,为了产生颜色,您可以添加一个包含颜色的列到数据框中。然后可以将这些颜色传递给scatterc关键字参数。

创建带有不易访问条目的图例的常用解决方案是generate proxy artists。在这种情况下,可以创建一组不同颜色的标记并将其提供给legend的参数handles。图例标签就是数据框中的最后一个名称。

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