我需要使用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
)产生这个:
我可以使用以下方法生成histtype='step'
直方图:
plt.hist(x1, bins=bin_n, histtype='step', color='r')
并获得:
但是它不会被param
值规范化。
答案 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.stepfig, 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()
这是结果:
step
生成的红线等于bar
生成的蓝线。