散点图 pandas 带有分类标签 rows/columns 的 DataFrame
Scatter plotting pandas DataFrame with categorically labeled rows/columns
我想使用 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()
哪种作品。
现在,问题是:是否有更直观、更集成的方法来生成此散点图,最好不要拆分数据和元数据?
这并不完全是您所要求的,但它有助于以类似的方式可视化值:
import seaborn as sns
sns.heatmap(df[::-1], annot=True)
结果:
也许不是您正在寻找的完整答案,而是一个想法,可以帮助节省时间并提高 flat=
行代码的可读性。
Pandas unstack method will produce a Series with a 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
中)。在这里,我将 levels
和 labels
分配给更适合绘图的信息量更大的变量名称。
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
形状上试过这个,它似乎很有效。
也许您可以使用 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()
我想使用 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()
哪种作品。
现在,问题是:是否有更直观、更集成的方法来生成此散点图,最好不要拆分数据和元数据?
这并不完全是您所要求的,但它有助于以类似的方式可视化值:
import seaborn as sns
sns.heatmap(df[::-1], annot=True)
结果:
也许不是您正在寻找的完整答案,而是一个想法,可以帮助节省时间并提高 flat=
行代码的可读性。
Pandas unstack method will produce a Series with a 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
中)。在这里,我将 levels
和 labels
分配给更适合绘图的信息量更大的变量名称。
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
形状上试过这个,它似乎很有效。
也许您可以使用 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()