堆叠直方图不会堆叠

Posted

技术标签:

【中文标题】堆叠直方图不会堆叠【英文标题】:Stacked histogram will not stack 【发布时间】:2014-03-12 23:42:09 【问题描述】:

我正在尝试运行以下代码:

variable_values = #numpy vector, one dimension, 5053 values between 1 and 0.
label_values = #numpy vector, one dimension, 5053 values, discrete value of either 1 OR 0.
x = variable_values[variable_values != '?'].astype(float)
y = label_values[variable_values != '?'].astype(float)

print np.max(x) #prints 0.90101
print np.max(y) #prints 1.0


N = 5053
ind = np.arange(N)    # the x locations for the groups
width = 0.45       # the width of the bars: can also be len(x) sequence
n, bins, patches = plt.hist(x, 5, stacked=True, normed = True)

#Stack the data
plt.figure()
plt.hist(x, bins, stacked=True, normed = True)
plt.hist(y, bins, stacked=True, normed = True)
plt.show()

我想要实现的是下图:

每个条上的颜色根据label 的值是1 还是0 进行拆分。

不幸的是,我目前的输出是:

这有两点不正确 - 首先它没有正确堆叠。其次,Y 轴上的值上升到 1.6,但我相信 Y 轴应该包含属于每个子组的数据条数(因此,如果所有数据条的值都在 0-0.25 之间,那么只有显示数据的栏将是第一个)。

【问题讨论】:

这是一个直方图。最高峰将是最频繁的值,而不是最大值。 @M4rtini 对不起,是的,你是对的 - 为什么这里最多打印 1.6?理想情况下,我喜欢将 5053 条数据分成四个条形(数据条数显示在 Y 轴上),并且条形按标签==1 和标签==0 的数字拆分。抱歉,我对自己的问题感到困惑。马上更新。 【参考方案1】:

variable_values = #numpy 向量,一维,1 到 0 之间的 5053 个值。

label_values = #numpy 向量,一维,5053 个值,离散 值为 1 或 0。

您正在尝试对 x 和 y 使用相同的 bin。 x 可能是从 0-1 不包括边缘。所以 y 超出了您正在绘制的 bin 范围。

它是 1.6,因为您选择了标准化绘图。将该参数设置为 false 以获取实际计数。

这应该可以解决大部分问题:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.random(5053)
y = np.random.random_integers(0,1, 5053)

# x = variable_values[variable_values != '?'].astype(float)
# y = label_values[variable_values != '?'].astype(float)

print np.max(x) #prints 0.90101
print np.max(y) #prints 1.0


N = 5053
ind = np.arange(N)    # the x locations for the groups
width = 0.45       # the width of the bars: can also be len(x) sequence
n, bins, patches = plt.hist(x, 5, stacked=True, normed = True)

bins[0] = 0
bins[-1] = 1

#Stack the data
plt.figure()
plt.hist(y, bins, stacked=True, normed = False)
plt.hist(x, bins, stacked=True, normed = False)
plt.show()

【讨论】:

【参考方案2】:

我可以建议一个更简单的解决方案:

variable_values=np.random.random(size=5053)
label_values=np.random.randint(0,2, size=5053)
plt.hist(variable_values, label='1')
plt.hist(variable_values[label_values==0], label='0')
plt.legend(loc='upper right')
plt.savefig('temp.png')

实际上由于label_values 是1 或0,你甚至不需要堆叠直方图。只需制作 1 和 0 的直方图,然后在顶部叠加 0 的直方图。

使用堆栈直方图,虽然我更喜欢只在有许多不同的类时使用:

plt.hist([variable_values[label_values==1],variable_values[label_values==0]], stacked=True, label=['1', '0'])

【讨论】:

以上是关于堆叠直方图不会堆叠的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:可视化人口金字塔图直方图(堆叠直方图连续变量堆叠直方图离散变量堆叠直方图)密度图箱图(添加抖动数据点tufte箱图多分类变量分组箱图)小提琴图

python使用matplotlib可视化堆叠的直方图(stacked histogram plot)多个类别的数据在直方图区间层面累积堆叠起来

Python使用matplotlib可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Continuous Variable)

Python使用matplotlib可视化离散(分类)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Categorical Variable)

[Python Study Notes]堆叠直方图绘制

R语言ggplot2可视化:可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩自定义直方图bin的个数(Histogram for Continuous Variable)