分散绘制带有明确标记的行/列的pandas DataFrame

DYZ*_*DYZ 9 python matplotlib scatter-plot dataframe pandas

我想生成一个pandas DataFrame的散点图,其中包含分类行和列标签matplotlib.示例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
Run Code Online (Sandbox Code Playgroud)

标记大小是相应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()
Run Code Online (Sandbox Code Playgroud)

哪种作品. 哪种作品

现在,问题:是否有更直观,更集成的方法来生成此散点图,理想情况下不分割数据和元数据?

Kev*_*vin 7

也许不是您正在寻找的整个答案,而是一个有助于flat=通过代码行节省时间和可读性的想法.

Pandas unstack方法将生成一个带有MultiIndex的Series .

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]])
Run Code Online (Sandbox Code Playgroud)

MultiIndex包含构造图(in labels)所需的x和y点.在这里,我给你levelslabels更多信息的变量名密谋更适合.

xlabels, ylabels = dfu.index.levels
xs, ys = dfu.index.labels
Run Code Online (Sandbox Code Playgroud)

从这里开始绘图是非常简单的.

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

在此输入图像描述

我尝试了几种不同的DataFrame形状,它似乎支撑着.