比例的绘图类型(带有色调)

时间:2017-08-09 21:29:00

标签: python pandas matplotlib seaborn

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

enter image description here

hue只是分类照片的数量。

我的问题是 - 是否有seaborn或matplotlib的情节类型显示比例而不是绝对数量?

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

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

1 个答案:

答案 0 :(得分:2)

我建议考虑将数据生成和可视化分开,而不是试图找到一个能完全符合你想要的特殊情况绘图功能。最后你想要的是绘制一些值的条形图,因此我们的想法是以一种可以轻松绘制数据的方式生成数据。

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

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

enter image description here