Pandas:在bar上同时使用log和stack p

2024-07-01 08:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些来自亚马逊的数据,我想继续研究。我想包括一个情节是每个品牌的收视率分布,我认为最好的方法是一个堆叠的条形图。在

然而,有些品牌的评价要比其他品牌高出很多,所以我必须使用原木比例,否则情节将是3个高峰,而其他品牌将无法体面地看到。在

大约有30万个像这样的

reviewID  brand      overall
0         Logitech   5.0
1         Garmin     4.0
2         Logitech   4.0
3         Logitech   5.0

我用过这个密码

^{pr2}$

这就是结果

bar plot

现在,如果你不熟悉这些数据,这可能看起来是可以接受的,但实际上不是这样的。1.0的评级堆栈看起来太大了,因为在这个范围内,对数不是“完全有效”的,而是可以得到更好的分数。 有没有办法在对数图上线性表示评级分布?在

我的意思是,如果60%的收视率是5.0,那么60%的酒吧应该是粉红色的,而不是我现在的


Tags: 数据方法对数评价比例条形图品牌情节
3条回答

用刻度线来避免用刻度线在绘图时出现的问题。有了这个,你可以用相同的比例尺来比较每个小节。但你需要一个更长的数字(5倍以上)。简单地stacked=False。示例数据:

poke_example

为了使条形图的总高度保持在对数刻度上,但条形图中类别的比例是线性的,可以重新计算堆积数据,使其在对数刻度上呈线性。在

作为一个示例,让我们选择6个具有非常不同总计([5,10,50,100,500,1000])的数据集,这样在线性比例下,较低的条形图将非常小。让我们把它分成30%、50%和20%的部分(为了简单起见,所有不同的数据按相同的比例划分)。在

然后,我们可以计算出每个数据点的大小,这些数据点以后应该出现在堆积条形图上,这样30%、50%和20%的比率保留在对数比例图中,最后绘制这些新创建的数据。在

from __future__ import division 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

a = np.array([5,10,50,100,500,1000])

p = [0.3,0.5,0.2]
c = np.c_[p[0]*a,p[1]*a, p[2]*a]

d = np.zeros(c.shape)
for j, row in enumerate(c):
    g = np.zeros(len(row)+1)
    G = np.sum(row)
    g[1:] = np.cumsum(row)
    f = 10**(g/G*np.log10(G))
    f[0] = 0
    d[j, :] = np.diff( f )

collabels = ["{:3d}%".format(int(100*i)) for i in p]     
dfo = pd.DataFrame(c, columns=collabels)
df2 = pd.DataFrame(d, columns=collabels)

fig, axes = plt.subplots(ncols=2)

axes[0].set_title("linear stack bar")
dfo.plot.bar(stacked=True, log=False, ax=axes[0])
axes[0].set_xticklabels(a)

axes[1].set_title("log total barheight\nlinear stack distribution")
df2.plot.bar(stacked=True, log=True, ax=axes[1])
axes[1].set_xticklabels(a)
axes[1].set_ylim([1, 1100])
plt.show()

enter image description here

最后一句话:我认为这样的情节应该小心。它可能对检查有用,但我不建议向其他人展示这样一个图,除非你能确保他们完全理解所画的内容和如何阅读它。否则,这可能会引起很多混乱,因为堆叠的类别的高度与比例不匹配,这只是一个错误。显示虚假数据会带来很多麻烦!在

没有数据的两个建议(提供样本数据更好)

选项1
使用value_counts(normalize=True)

brandScore = swissDF.groupby(['brand', 'overall'])['brand']
brandScore = brandScore.value_counts(normalize=True).unstack('overall')
brandScore.plot(kind='bar', stacked=True, figsize=(8,6))

选项2
除以行和

^{pr2}$

相关问题 更多 >

    热门问题