绘图直方图通过固定参数归一化

时间:2014-07-13 01:06:24

标签: python matplotlib plot histogram

我需要使用histtype='step'样式绘制一个规范化直方图(通过规范化我的意思是除以固定值)。

问题在于,plot.bar()似乎并不支持这种风格,如果我使用plot.hist(),那我就不能(或者至少不要这样做)知道如何绘制标准化直方图。

这是我的意思的MWE:

import matplotlib.pyplot as plt
import numpy as np

def rand_data():
    return np.random.uniform(low=10., high=20., size=(200,))

# Generate data.
x1 = rand_data()

# Define histogram params.
binwidth = 0.25
x_min, x_max = x1.min(), x1.max()
bin_n = np.arange(int(x_min), int(x_max + binwidth), binwidth)

# Obtain histogram.
hist1, edges1 = np.histogram(x1, bins=bin_n)
# Normalization parameter.
param = 5.

# Plot histogram normalized by the parameter defined above.
plt.ylim(0, 3)
plt.bar(edges1[:-1], hist1 / param, width=binwidth, color='none', edgecolor='r')
plt.show()

(注意规范化:hist1 / param)产生这个:

enter image description here

我可以使用以下方法生成histtype='step'直方图:

plt.hist(x1, bins=bin_n, histtype='step', color='r')

并获得:

enter image description here

但是它不会被param规范化

2 个答案:

答案 0 :(得分:1)

步骤图将从一组箱中生成您想要的外观以及这些箱中的计数(或标准化计数)。在这里,我使用plt.hist获取计数,然后绘制它们,计数归一化。复制第一个条目以使其实际上有一条线是必要的。

(a,b,c) = plt.hist(x1, bins=bin_n, histtype='step', color='r')
a = np.append(a[0],a[:])
plt.close()
step(b,a/param,color='r')

这不太对,因为它没有正确完成情节。线的末端悬挂在自由空间而不是沿x轴下降。

你可以通过在' a'的末尾添加0来解决这个问题。还有一个bin指向b

a=np.append(a[:],0)
b=np.append(b,(2*b[-1]-b[-2]))
step(b,a/param,color='r')

最后,如果您使用过

,则会使用上面提到的ax.step
fig, ax = plt.subplots()

让您直接访问图形和轴。有关示例,请参阅http://matplotlib.org/examples/ticks_and_spines/spines_demo_bounds.html

答案 1 :(得分:0)

根据tcaswell的评论(使用step),我已经开发了自己的答案。请注意,我需要向x(数组开头的一个零元素)和y数组添加元素(开头一个零元素,数组末尾另一个元素) step将在条形的开头和结尾绘制垂直线。

以下是代码:

import matplotlib.pyplot as plt
import numpy as np

def rand_data():
    return np.random.uniform(low=10., high=20., size=(5000,))

# Generate data.
x1 = rand_data()

# Define histogram params.
binwidth = 0.25
x_min, x_max = x1.min(), x1.max()
bin_n = np.arange(int(x_min), int(x_max + binwidth), binwidth)

# Obtain histogram.
hist1, edges1 = np.histogram(x1, bins=bin_n)
# Normalization parameter.
param = 5.

# Create arrays adding elements so plt.bar will plot the first and last
# vertical bars.
x2 = np.concatenate((np.array([0.]), edges1))
y2 = np.concatenate((np.array([0.]), (hist1 / param), np.array([0.])))

# Plot histogram normalized by the parameter defined above.
plt.xlim(min(edges1) - (min(edges1) / 10.), max(edges1) + (min(edges1) / 10.))
plt.bar(x2, y2, width=binwidth, color='none', edgecolor='b')
plt.step(x2, y2, where='post', color='r', ls='--')

plt.show()

这是结果:

enter image description here

step生成的红线等于bar生成的蓝线。