Pandas 散点图使用数据框字段派生颜色和图例

Posted

技术标签:

【中文标题】Pandas 散点图使用数据框字段派生颜色和图例【英文标题】:Pandas Scatterplot Using Data Frame Fields to Derive Colors and Legend 【发布时间】:2017-04-29 03:51:44 【问题描述】:

我想创建一个散点图,其中显示在 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 举个例子。

【问题讨论】:

您可以使用颜色列表为每个点分配不同的颜色:['r', 'b', 'g', 'k', 'y']。我不确定如何安排图例,以便每个图例都有自己的行,但不要将标签传递给系列。您可以循环并调用 scatterplot 5 次不同的时间,这将为您提供所需的绘图。 这里其实也有类似的问题:***.com/questions/16614558/… 【参考方案1】:

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

使用不易访问的条目创建图例的常用解决方案是generate proxy artists。在这种情况下,将创建一组不同颜色的标记并将其提供给legendhandles 参数。然后,图例标签就是数据框中的 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()

【讨论】:

【参考方案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))

我(还没有)弄清楚如何使图例中的点大小相同——我不确定这就是你想要的。我认为不同的尺寸看起来不错,并且可以帮助定位情节中的人。

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

【讨论】:

为了使图例中的点大小相等,您可以像这样调整图例中手柄的大小handles = plt.gca().get_legend_handles_labels()[0]; [handle.set_markersize(10) for handle in handles]; plt.legend(handles=handles)

以上是关于Pandas 散点图使用数据框字段派生颜色和图例的主要内容,如果未能解决你的问题,请参考以下文章

绘制散点图图例不显示图例标题,但每种颜色都有 = 符号

R语言散点图可视化:自定义标题和标签拟合回归线lowess为散点图添加平滑拟合线修改散点图中点颜色和点符号分组散点图添加图例pairs可视化散点图矩阵ggplt2可视化lattice

R语言使用hexbin包的hexbin函数可视化散点图应对数据量太大且有数据重叠的情况普通散点图可视化效果变差的情况提供了对六边形单元格的二元绑定通过图例颜色标定每一个区域数据点的数量

如何使用 Plotly 在 Python 中使用 Pandas 数据框列设置散点图悬停信息

使用 Seaborn 抛光散点图图例

如何修改散点图图例以显示相同类型句柄的不同格式?