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

时间:2017-06-02 03:17:13

标签: python pandas matplotlib dataframe scatter-plot

我想使用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()

哪种作品。 Which kind of works

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

3 个答案:

答案 0 :(得分:7)

也许不是您正在寻找的完整答案,而是使用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()

enter image description here

我在几个不同的DataFrame形状上尝试了这个,但它似乎有用了。

答案 1 :(得分:4)

这不完全是你要求的,但它有助于以类似的方式可视化值:

import seaborn as sns

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

结果:

enter image description here

答案 2 :(得分:3)

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

doc = QDomDocument()
root = doc.createElement("Animation")
doc.appendChild(root)
stream = QTextStream(xmlfile)
doc.save(stream, 0)

enter image description here