带有分类标记的行/列的散点图 Pandas DataFrame

Posted

技术标签:

【中文标题】带有分类标记的行/列的散点图 Pandas DataFrame【英文标题】:Scatter plotting pandas DataFrame with categorically labeled rows/columns 【发布时间】:2017-11-03 08:26:21 【问题描述】:

我想使用matplotlib 生成带有分类行和列标签的 pandas DataFrame 散点图。示例 DataFrame 如下所示:

import pandas as pd
df = pd.DataFrame("a": [1,2], "b": [3,4], index=["c","d"])
#   a  b
#c  1  2
#d  3  4

标记大小是各个 DataFrame 值的函数。到目前为止,我想出了一个笨拙的解决方案,它本质上是枚举行和列,绘制数据,然后重建标签:

flat = df.reset_index(drop=True).T.reset_index(drop=True).T.stack().reset_index()
#   level_0  level_1  0
#0        0        0  1
#1        0        1  2
#2        1        0  3
#3        1        1  4

flat.plot(kind='scatter', x='level_0', y='level_1', s=100*flat[0])
plt.xticks(range(df.shape[1]), df.columns)
plt.yticks(range(df.shape[0]), df.index)
plt.show()

哪种有效。

现在,问题:有没有更直观、更集成的方法来生成这个散点图,最好不要拆分数据和元数据?

【问题讨论】:

我认为我们不能使用非数字数据进行绘图。 AFAIK 无论如何,您都必须单独设置刻度... 我猜这个问题翻译成“为什么还没有库实现我的自定义绘图愿望功能?” 【参考方案1】:

这并不完全符合您的要求,但它有助于以类似的方式可视化值:

import seaborn as sns

sns.heatmap(df[::-1], annot=True)

结果:

【讨论】:

【参考方案2】:

也许不是您正在寻找的全部答案,而是通过flat= 代码行帮助节省时间和提高可读性的想法。

Pandas unstack 方法将产生一个带有MultiIndex 的系列。

dfu = df.unstack()

print(dfu.index)
MultiIndex(levels=[[u'a', u'b'], [u'c', u'd']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]])

MultiIndex 包含构建绘图所需的 x 和 y 点(在labels 中)。在这里,我将 levelslabels 分配给更适合绘图的信息量更大的变量名称。

xlabels, ylabels = dfu.index.levels
xs, ys = dfu.index.labels

从这里开始绘图非常简单。

plt.scatter(xs, ys, s=dfu*100)
plt.xticks(range(len(xlabels)), xlabels)
plt.yticks(range(len(ylabels)), ylabels)
plt.show()

我在几个不同的 DataFrame 形状上尝试过这个,它似乎能坚持下去。

【讨论】:

【参考方案3】:

也许您可以使用 numpy 数组和 pd.melt 创建散点图,如下所示:

arr = np.array([[i,j] for i in range(df.shape[1]) for j in range(df.shape[0])])
plt.scatter(arr[:,0],arr[:,1],s=100*pd.melt(df)['value'],marker='o')
plt.xlabel('level_0')
plt.ylabel('level_1')
plt.xticks(range(df.shape[1]), df.columns)
plt.yticks(range(df.shape[0]), df.index)
plt.show()  

【讨论】:

以上是关于带有分类标记的行/列的散点图 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫数据框中的列标记气泡图/散点图?

我可以使用带有熊猫数据框的散点图绘制回归线并显示参数吗?

Pandas / Pyplot中的散点图:如何按类别绘制[重复]

使用 OpenGL 的散点图:如何设置标记样式

Scilab中按密度着色的散点图

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