Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为分类数据绘制多个条形图_Python_Matplotlib - Fatal编程技术网

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

Python 为分类数据绘制多个条形图,python,matplotlib,Python,Matplotlib,我正在寻找一种在matplotlib中为每个值绘制多个条形图的方法。对于数值数据,这可以通过向X数据添加偏移来实现,例如: plt.bar()(和ax.bar())也会自动处理分类数据: X = ['A','B','C'] Y = [1,2,3] plt.bar(X, Y) plt.show() 这里,显然不可能添加偏移,因为类别与轴上的值没有直接关联。我可以使用plt.xticks():,手动为类别分配数值,并在x轴上设置标签 X = ['A','B','C'] Y = [1,2,3]

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

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

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

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

这里,显然不可能添加偏移,因为类别与轴上的值没有直接关联。我可以使用
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()


但是,我想知道是否有一种更优雅的方法可以利用
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()

使用熊猫 您还可以使用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()

感谢您的回答和代码示例。我知道pandas具有处理子类别的能力(事实上,我的数据已经存储在数据框中),但为了与其他绘图保持一致,我一直在寻找matplotlib的解决方案。为了在X轴上旋转“a”、“B”、“C”,在使用pandas时,使用df.plot.bar(rot=0)上述答案,也可以简化为一行:
df.set_index(X.plot.bar()
(这样就不会丢失条的分类名称)@Kevad您的评论令人困惑,因为
X
已经是索引,所以无需再次设置它。@importanceofbeingerest感谢您的更正。我的意思是
df.plot.bar()还生成相同的输出:)
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()