我正在尝试生成直方图的条形图,正在使用numpy对一组图像进行计算,但是我的图实际上并未在轴上绘制条形图。我正在使用的代码是:
def makebarplot(bins, values, title = None, export = False,
path = None, file_name = None):
'''
This function will take the outputs
of np.histogram results and make a
barplot of it.
'''
#creating the object
img, ax1 = plt.subplots(figsize = (13,8))
ax1.bar(bins[:-1],values)
#adjusting the graphic
ax1.set_xscale('log')
ax1.set_yscale('log')
ax1.set_xlabel('Values')
ax1.set_xticks(bins)
ax1.set_ylabel('Frequency')
ax1.set_title(title)
plt.show()
if export is True:
#saving figure
img.savefig(path+file_name, bbox_inches = 'tight')
#closing the plot
#plt.close()
return
#the bins I'm using
bins = [1e1**i for i in range(2,20)]
#the values I'm entering they are the frequency of
# values in between each of the corresponding
#bins defined above
values = [0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00,
1.000000e+00, 1.000000e+01, 1.100000e+02, 8.870000e+02,
6.582000e+03, 4.542300e+04, 2.630240e+05, 1.090866e+06,
2.281769e+06, 1.199336e+06, 4.057230e+05,
6.878300e+04, 1.211000e+03]
makebarplot(bins,ar_values)
我想念什么?
我正在咨询post,这表明这可能是由于条形位置不正确而发生的,但是,我未能掌握将其与数据连接的概念,或者如果我丢失了某些内容其他。
我也不明白为什么我必须修剪其中一个垃圾箱,所以值和垃圾箱应具有相同的长度。由于结果将介于两者之间,因此自然而然地我会假定垃圾箱的长度比包含值的列表长一倍。
答案 0 :(得分:1)
仅因为您命名了bins
条的位置,并不意味着它们成为垃圾箱。 (如“我将汽车命名为“法拉利”,但并没有变成红色。”)
因此,这里发生的是条形图放置在箱的左边缘(如您将bins[:-1]
指定为位置)。但是,未指定条的宽度,因此matplotlib采用默认的1单位条宽度。一个规模超过20个数量级的单元确实很小。实际上,在13英寸宽,dpi为100的图形上,您的分辨率大约是每个像素7e14个单位,比1大得多。
最后,也可以定义条的宽度。然后,您还需要将这些条对齐到其左边缘。
ax1.bar(bins[:-1],values, width=np.diff(bins), align="edge", ec="k")
(这里np
是numpy
)
请注意,前四个小节丢失了,因为它们的高度为0
,在对数刻度上未定义。