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

tsa*_*sch 5 python matplotlib

我正在寻找一种在matplotlib中为每个值绘制多个条形图的方法.为数字数据,这可以是将偏移到X数据来实现,如例如描述在这里:

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()
Run Code Online (Sandbox Code Playgroud)

多个数字数据条

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

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

plt.bar(X, Y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

类别处理

在这里,显然不可能添加偏移量,因为类别不与轴上的值直接关联.我可以手动为类别分配数值,并在x轴上设置标签plt.xticks():

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()
Run Code Online (Sandbox Code Playgroud)

手动设置类别标签

但是,我想知道是否有更优雅的方式使用自动类别处理bar(),特别是如果之前不知道每个类别的类别和条的数量(这导致一些摆弄条宽以避免重叠).

Imp*_*est 15

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用熊猫

您也可以使用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 为了在 X 轴上旋转“A”、“B”、“C”,请使用 df.plot.bar(rot=0) (3认同)