Matplotlib中直方图上的多个断轴

时间:2014-02-17 20:42:32

标签: python macos python-2.7 matplotlib histogram

所以我有一些我希望通过频率密度(不等级宽度)直方图绘制的数据,并通过一些在线搜索,我创建了这个允许我这样做。

import numpy as np
import matplotlib.pyplot as plt

plt.xkcd()
freqs = np.array([3221, 1890, 866, 529, 434, 494, 382, 92, 32, 7, 7])
bins = np.array([0, 5, 10, 15, 20, 30, 50, 100, 200, 500, 1000, 1500])
widths = bins[1:] - bins[:-1]
heights = freqs.astype(np.float)/widths

plt.xlabel('Cost in Pounds')
plt.ylabel('Frequency Density')

plt.fill_between(bins.repeat(2)[1:-1], heights.repeat(2), facecolor='steelblue')
plt.show()  

然而,正如您所看到的,该数据在x轴上延伸到数千,在y轴(密度)上从微小数据(<1)延伸到大数据(> 100)。要解决这个问题,我需要打破两个轴。到目前为止,我最接近帮助的是this,我发现这很难使用。你能帮忙吗? 谢谢,Aj。

1 个答案:

答案 0 :(得分:0)

你可以使用条形图。设置xtick标签以表示bin值。

具有对数y标度

import numpy as np
import matplotlib.pyplot as plt

plt.xkcd()
fig, ax = plt.subplots()
freqs = np.array([3221, 1890, 866, 529, 434, 494, 382, 92, 32, 7, 7])
freqs = np.log10(freqs)
bins = np.array([0, 5, 10, 15, 20, 30, 50, 100, 200, 500, 1000, 1500])
width = 0.35
ind = np.arange(len(freqs))
rects1 = ax.bar(ind, freqs, width)
plt.xlabel('Cost in Pounds')
plt.ylabel('Frequency Density')
tick_labels = [ '{0} - {1}'.format(*bin) for bin in  zip(bins[:-1], bins[1:])]
ax.set_xticks(ind+width)
ax.set_xticklabels(tick_labels)
fig.autofmt_xdate()
plt.show()