Python Matplotlib堆叠直方图numpy.ndarray错误

Python Matplotlib堆叠直方图numpy.ndarray错误,python,matplotlib,histogram,Python,Matplotlib,Histogram,我尝试使用matplotlib通过在数据框中循环类别并根据字典指定条形图颜色来制作堆叠直方图 我在调用ax1.hist()时遇到此错误。我该怎么修? AttributeError:'numpy.ndarray'对象没有属性'hist' 可复制示例 import pandas as pd import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec %matplotlib inline plt.style.use('s

我尝试使用matplotlib通过在数据框中循环类别并根据字典指定条形图颜色来制作堆叠直方图

我在调用
ax1.hist()
时遇到此错误。我该怎么修?
AttributeError:'numpy.ndarray'对象没有属性'hist'

可复制示例

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
%matplotlib inline
plt.style.use('seaborn-whitegrid')

y = [1,5,9,2,4,2,5,6,1]
cat = ['A','B','B','B','A','B','B','B','B']
df = pd.DataFrame(list(zip(y,cat)), columns =['y', 'cat'])

fig, axes = plt.subplots(3,3, figsize=(5,5), constrained_layout=True)
fig.suptitle('Histograms')
ax1 = axes[0]

mycolorsdict = {'A':'magenta', 'B':'blue'}
for key, batch in df.groupby(['cat']):
    ax1.hist(batch.y, label=key, color=mycolorsdict[key],
    density=False, cumulative=False, edgecolor='black',
    orientation='horizontal', stacked=True)
更新的努力,仍然不起作用

这很接近,但不是堆叠(应在y=5时看到堆叠);我想可能是因为循环

mycolorsdict = {'A':'magenta', 'B':'blue'}
for ii, ax in enumerate(axes.flat):
    for key, batch in df.groupby(['cat']):
        ax.hist(batch.y, 
        label=key, color=mycolorsdict[key],density=False, edgecolor='black',
        cumulative=False, orientation='horizontal', stacked=True)

要绘制特定子批次,需要两个索引(行、列),因此第一个子批次的轴[0,0]。错误消息来自使用
ax1=axes[0]
而不是
ax1=axes[0,0]

现在,要通过
ax.hist()
创建堆叠直方图,需要同时提供所有y数据。下面的代码显示了如何从
groupby
的结果开始执行此操作。还要注意的是,当值是离散的时,显式设置bin边界非常重要,确保值正好位于这些边界之间。在两半处设置边界是一种方法

使用seaborn的方法可以简化很多事情。以下是所用参数的明细:

  • data=df
    数据帧
  • y='y'
    给出直方图的数据帧列。使用
    x=
    (而不是
    y=
    )作为垂直直方图
  • hue='cat'
    提供数据帧列以创建多个组
  • 调色板=mycolorsdict
    ;调色板定义了颜色;分配调色板的方法有很多种,其中之一是在
    色调
    值上设置字典
  • discrete=True
    :处理离散数据时,seaborn会设置适当的箱子边界
  • multiple='stack'
    根据
    hue
    类别创建堆叠直方图
  • alpha=1
    :默认seaborn将alpha设置为
    0.75
    ;也可以更改此选项
  • ax=轴[0,1]
    :在第一行的第二个子批次上绘制
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
导入seaborn作为sns
plt.style.use('seaborn-whitegrid'))
y=[1,5,9,2,4,2,5,6,1]
cat=['A','B','B','B','A','B','B','B','B']
df=pd.DataFrame({'y':y'cat':cat})
图,轴=plt.子图(3,3,figsize=(20,10),约束的_布局=真)
图suptitle(“直方图”)
mycolorsdict={'A':'洋红','B':'blue'}
groups=df.groupby(['cat']))
轴[0,0].hist([batch.y代表uz,成组批处理],
标签=[key for key,in group],颜色=[mycolorsdict[key]for key,in group],密度=False,
edgecolor='black',
累计=假,方向=水平,堆叠=真,箱子=np.arange(0.5,10))
轴[0,0]。图例()
sns.histplot(数据=df,y='y',色调=cat',调色板=mycolorsdict,离散=True,多重='stack',alpha=1,ax=axs[0,1])
plt.show()

在第二个版本中使用
ax.hist()
。@T先生,这非常接近,谢谢你——我仍然无法使堆叠工作正常进行(问题更新),我想可能是第二个循环的问题。没有第二个循环有更好的方法吗?