熊猫散点图使用数据帧字段导出颜色和图例
我想创建一个散点图,其中显示了在熊猫中彼此映射的两列,大小的三分之一以及基于标签点的颜色(在下面的情况,姓氏)。熊猫散点图使用数据帧字段导出颜色和图例
然后,我希望有一个传说,显示的颜色,然后
每个姓氏应该用不同的颜色和图例显示关联的姓氏值点,例如,一个绿点和米勒,一个红点和雅各布森等
%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)
这一点让我这样的事情:
我不知道如何获得颜色(理想情况下,我喜欢使用调色板)或如何让图例显示姓氏和点
任何帮助将很多赞赏..谢谢!
注 - 我从这里以Chris Albon为例。
对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))
我也没弄明白(还)如何使点图例相同的大小 - 并且我不知道这是你想要的。我认为不同的尺寸看起来不错,可以帮助找到情节中的人。
或者,您只能使用一个呼叫scatter
,然后检查返回的PathCollection
的属性并手动创建图例,但我认为我的方法更清晰。
为了让图例中的点大小相同,您可以调整图例中手柄的大小,如下所示:handles = plt.gca()。get_legend_handles_labels ()[0]; [handle.set_markersize(10)for handle in handles]; plt.legend(handles = handles)' – ImportanceOfBeingErnest
首先,为了产生颜色,您可以添加一个包含颜色的列到数据框中。然后可以将这些颜色传递给scatter
的c
关键字参数。
创建带有不易访问条目的图例的常用解决方案是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()
可以分配每一个点不同的颜色与颜色的列表:'[ 'R', 'B', 'G', 'K', 'Y']'。我不知道如何安排图例,以便每个人都有自己的排名,但是不会通过一系列的标签。你可以做一个循环,并调用散布图5次不同的时间,这将得到你想要的情节。 –
这里实际上有一个类似的问题:http:// *。com/questions/16614558/legend-using-pathcollections-in-matplotlib – ImportanceOfBeingErnest