我想创建一个散点图,它显示了pandas中相互映射的两个列,第三个是大小,然后是基于标签的点的颜色(在下面的例子中是last_name)。
然后我想要一个图例,它显示一个点的颜色,然后是last_name值
每个姓氏应该与不同的颜色相关联,图例显示,例如,绿点和米勒,红点和雅各布森等。
%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。
发布于 2016-12-13 23:52:51
首先,为了生成颜色,您可以将带有颜色的列添加到数据框架中。然后可以将这些颜色传递给scatter
的c
关键字参数。
创建带有不易访问的条目的图例的通常解决方案是使用generate proxy artists。在本例中,我们将创建一组不同颜色的标记,并将其提供给legend
的handles
参数。然后,图例标签就是数据帧中的last_names。
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()
发布于 2016-12-13 23:32:29
对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
的属性并手动构建图例,但我认为我的方法更简洁。
https://stackoverflow.com/questions/41132058
复制相似问题