python - 为分类数据绘制多个条形图

标签 python matplotlib

我正在寻找一种在 matplotlib 中为每个值绘制多个条形图的方法。对于数字数据,这可以通过向 X 数据添加偏移量来实现,如示例 here 所述。 :

import numpy as np
import matplotlib.pyplot as plt

X = np.array([1,3,5])
Y = [1,2,3]
Z = [2,3,4]

plt.bar(X - 0.4, Y) # offset of -0.4
plt.bar(X + 0.4, Z) # offset of  0.4
plt.show()

Multiple bars for numerical data

plt.bar()(和 ax.bar())也自动处理分类数据:

X = ['A','B','C']
Y = [1,2,3]

plt.bar(X, Y)
plt.show()

Category handling

这里,显然不可能添加偏移量,因为类别与轴上的值没有直接关联。我可以手动为类别分配数值并使用 plt.xticks():,

在 x 轴上设置标签
X = ['A','B','C']
Y = [1,2,3]
Z = [2,3,4]
_X = np.arange(len(X))

plt.bar(_X - 0.2, Y, 0.4)
plt.bar(_X + 0.2, Z, 0.4)
plt.xticks(_X, X) # set labels manually
plt.show()

Manually setting category labels

但是,我想知道是否有一种更优雅的方法可以利用 bar() 的自动类别处理,特别是如果在之前(这会导致对条形宽度进行一些调整以避免重叠)。

最佳答案

matplotlib 中没有自动支持子类别。

使用 matplotlib 放置条形图

您可以按照数字方式放置条形图,就像您在问题中提出自己的建议一样。您当然可以让代码管理未知数量的子类别。

import numpy as np
import matplotlib.pyplot as plt

X = ['A','B','C']
Y = [1,2,3]
Z = [2,3,4]

def subcategorybar(X, vals, width=0.8):
    n = len(vals)
    _X = np.arange(len(X))
    for i in range(n):
        plt.bar(_X - width/2. + i/float(n)*width, vals[i], 
                width=width/float(n), align="edge")   
    plt.xticks(_X, X)
    
subcategorybar(X, [Y,Z,Y])

plt.show()

enter image description here

使用 Pandas

您也可以使用 pandas plotting wrapper,它可以计算出子类别的数量。它将为数据框的每列绘制一组。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

X = ['A','B','C']
Y = [1,2,3]
Z = [2,3,4]

df = pd.DataFrame(np.c_[Y,Z,Y], index=X)
df.plot.bar()

plt.show()

enter image description here

关于python - 为分类数据绘制多个条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48157735/

相关文章:

python - 中断并继续功能

python - 在 Python 中,使用 argparse,只允许正整数

python - 在 1 个 I/O channel 中提取 numpy 中的总和字典的最快方法

python - 如何使用轴位置作为引用在 matplotlib 上跨多个轴绘制框

python - 在两个表之间绘制箭头(作为图像)(Python)

python-3.x - 如何在 Seaborn 中为热图设置 x_ticks?

python - 我如何在 Seaborn 的同一个 catplot 上显示种类 ="swarm"和种类 ="point"?

python - 在 while 循环中使用 datetime.time()

python-3.x - 使用嵌套圆圈作为图例

python - 无法使用 python 向 mysql 插入值