用分类标签的行/列来散点绘制pandas DataFrame

8
我希望使用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

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

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()

哪种工作。

哪种工作

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


我认为我们不能使用非数字数据进行绘图。据我所知,您无论如何都必须单独设置刻度... - MaxU - stand with Ukraine
2
我猜这个问题的意思是:“为什么还没有库来实现我的自定义绘图函数?” - ImportanceOfBeingErnest
3个回答

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]])

MultiIndex包含构建图形所需的x和y点(在标签中)。 在这里,我将levels和labels分配给更适合绘图的信息变量名称。请保留HTML标记。
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形状,它似乎是可靠的。


4

虽然不是完全符合您所提出的要求,但以下方式可以帮助您以类似的方式可视化数值:

import seaborn as sns

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

结果:

在这里输入图片描述


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()  

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接