对于直方图,如何沿x轴保留所有指定的bin-ticks并仅显示指定bin-ticks的数字标签?

时间:2017-02-25 09:23:44

标签: python python-3.x matplotlib histogram binning

我有histogram with centered bin-ticks

如图所示,每个bin-tick的编号标签彼此如此接近,以至于数字不像我希望的那样清晰。我想在我的情节中保持居中的bin-ticks,但是标记每个其他bin-tick的值。

例如,第一个bin-tick是2.5,每个bin-width是5,所以下一个bin-tick是7.5,之后是12.5,等等。我想在x上打勾标记-axis在2.5,7.5,12.5等处可见,但我希望在x轴上只能看到数字标签2.5,12.5等。

我怎么能这样做?创建类似于我的直方图的代码(取决于值的随机模块)发布在下面。

PS - 我可以减少bin的数量以适应沿x轴的所有编号标签,但我更希望保持bin的数量,因为我将这个基本情况应用于更大的数据集指定的箱号。

import random
a = 48
b = 8
randg = []
for index in range(100):
    randg.append( random.gauss(a,b) )
data = sorted(randg)

small = 0 
big = 100 
numbins = 20 
binwide = (big - small) / numbins 
binleft = [] # left boundaries of bins
for index in range(numbins):
    binleft.append(small + index * binwide)
binbounds = [val for val in binleft] 
binbounds.append(big) # don't forget right boundary of last bin

binmids = [] # midpt of bins (for ticks)
for index in range(len(binbounds)-1):
    binmids.append( binwide/2 + index * binwide )

import matplotlib.pyplot as plt
plt.hist(data, bins = binbounds)
plt.xticks(binmids)
plt.show()

2 个答案:

答案 0 :(得分:2)

如果您也可以省略每一秒钟,一个简单的解决方案是将刻度设置为binmids列表的每一秒。

plt.xticks(binmids[::2]) 

enter image description here

如果这不是一个选项,您可以将刻度设置为完整的binmids列表,然后将每个其他ticklabel设置为空字符串("")。

plt.xticks(binmids)
ticklabels = [ binmids[i] if i % 2 == 0 else "" for i in range(len(binmids)) ]
plt.gca().set_xticklabels( ticklabels )

enter image description here

答案 1 :(得分:1)

一个简单的选择是仅使用其他每个刻度线调用xticks()

plt.hist(data, bins = binbounds)
plt.xticks(binmids[::2])
plt.show()