比例图类型(带色调)

Plot type for proportions (with hue)

在我维护的一个分类广告网站中,我正在比较在该标准中获得高于中位数观看次数的分类广告与低于中位数的分类广告。我称前者为“高性能”分类广告。这是一个简单的计数图:

hue 只是分类的照片数量。

我的问题是 - seaborn 或 matplotlib 中是否有显示比例而不是绝对计数的绘图类型?

我基本上想要相同的计数图,但每个条形图占该特定类别中总项目的百分比。例如,请注意在计数图中,包含 3 张照片的分类占 high perf 类别的比例要大得多。收集这些信息需要一段时间。如果每个条形的高度由其对其类别的贡献百分比表示,则比较起来会容易得多。这就是为什么我正在寻找我正在寻找的东西。

一个说明性的例子会很棒。

我建议不要试图找到一个可以完全满足您要求的特殊情况绘图函数,而是考虑将数据生成和可视化分开。最后,您想要绘制一些值的条形图,因此我们的想法是以易于绘制的方式生成数据。

为此,您可以 crosstab 有问题的两列,并将结果 table 中的每一行(或列)除以其总和。然后可以使用 pandas 绘图包装器轻松绘制此 table。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)
import pandas as pd
plt.rcParams["figure.figsize"] = 5.6, 7.0

n = 100
df = pd.DataFrame({"performance": np.random.choice([0,1], size=n, p=[0.7,0.3]),
                   "photo" :  np.random.choice(range(4), size=n, p=[0.6,0.1,0.2,0.1]),
                   "someothervalue" : np.random.randn(n) })

fig, (ax,ax2, ax3) = plt.subplots(nrows=3)

freq = pd.crosstab(df["performance"],df["photo"])
freq.plot(kind="bar", ax=ax)

relative = freq.div(freq.sum(axis=1), axis=0)
relative.plot(kind="bar", ax=ax2)

relative = freq.div(freq.sum(axis=0), axis=1)
relative.plot(kind="bar", ax=ax3)


ax.set_title("countplot of absolute frequency")
ax2.set_title("barplot of relative frequency by performance")
ax3.set_title("barplot of relative frequency by photo")
for a in [ax, ax2, ax3]: a.legend(title="Photo", loc=6, bbox_to_anchor=(1.02,0.5))
plt.subplots_adjust(right=0.8,hspace=0.6)
plt.show()