【问题标题】:Matplotlib stacked histogram numpy.ndarray errorMatplotlib 堆叠直方图 numpy.ndarray 错误
【发布时间】:2021-01-27 21:53:49
【问题描述】:

我正在尝试使用 matplotlib 通过循环遍历数据框中的类别并根据字典分配条形颜色来制作堆叠直方图。

我在调用ax1.hist() 时收到此错误。我应该如何解决它? AttributeError: 'numpy.ndarray' object has no attribute '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)

【问题讨论】:

  • 第二个版本改成ax.hist()
  • @Mr.T 非常接近,谢谢 - 我仍然无法让堆叠工作(问题已更新),我认为可能是第二个循环的问题。没有第二个循环有更好的方法吗?

标签: python matplotlib histogram


【解决方案1】:

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

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

使用 seaborn 的histplot() 可以简化很多事情。以下是使用的参数的细分:

  • data=df 数据框
  • y='y' 给出直方图的数据框列。使用x=(而不是y=)作为垂直直方图。
  • hue='cat' 提供数据框列以创建多个组
  • palette=mycolorsdict;调色板定义颜色;分配调色板的方法有很多,其中一种是在 hue 值上的字典
  • discrete=True: 在处​​理离散数据时,seaborn 会设置适当的 bin 边界
  • multiple='stack' 根据 hue 类别创建堆叠直方图
  • alpha=1:默认 seaborn 设置的 alpha 为 0.75;可选地,这可以更改
  • ax=axes[0, 1]:绘制第 1st 行的第 2nd 子图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as 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})

fig, axes = plt.subplots(3, 3, figsize=(20, 10), constrained_layout=True)
fig.suptitle('Histograms')

mycolorsdict = {'A': 'magenta', 'B': 'blue'}
groups = df.groupby(['cat'])
axes[0, 0].hist([batch.y for _, batch in groups],
                label=[key for key, _ in groups], color=[mycolorsdict[key] for key, _ in groups], density=False,
                edgecolor='black',
                cumulative=False, orientation='horizontal', stacked=True, bins=np.arange(0.5, 10))
axes[0, 0].legend()

sns.histplot(data=df, y='y', hue='cat', palette=mycolorsdict, discrete=True, multiple='stack', alpha=1, ax=axes[0, 1])

plt.show()

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2013-07-04
    • 2013-12-24
    • 2014-03-12
    • 2014-03-12
    • 2015-11-28
    • 2016-12-19
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多