在条形和Y轴之间添加内边距
我正在用下面的代码用matplotlib制作一个柱状图。当我的第一列或最后一列数据是0时,第一列就会紧贴着Y轴。
这是一个例子。注意第一列正好在x=0的地方。
如果我在这一列有数据,Y轴和第一列之间就会有很大的空隙,如下图所示。注意到多出来的柱子,现在在X=0的位置。如果我的最后一列也有数据,这种效果也会重复出现。

我的代码如下:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator
binVals = [0,5531608,6475325,1311915,223000,609638,291151,449434,1398731,2516755,3035532,2976924,2695079,1822865,1347155,304911,3562,157,5,0,0,0,0,0,0,0,0]
binTot = sum(binVals)
binNorm = []
for v in range(len(binVals)):
binNorm.append(float(binVals[v])/binTot)
fig = plt.figure(figsize=(6,4))
ax1 = fig.add_subplot(1,1,1)
ax1.bar(range(len(binNorm)),binNorm,align='center', label='Values')
plt.legend(loc=1)
plt.title("Demo Histogram")
plt.xlabel("Value")
plt.xticks(range(len(binLabels)),binLabels,rotation='vertical')
plt.grid(b=True, which='major', color='grey', linestyle='--', alpha=0.35)
ax1.xaxis.grid(False)
plt.ylabel("% of Count")
plt.subplots_adjust(bottom=0.15)
plt.tight_layout()
plt.show()
我该如何设置Y轴和我的第一根/最后一根柱子之间的固定间距呢?
另外,我注意到它被标记为“演示直方图”,这是因为我在纠正之前讨论的问题时错过了这个标签,具体可以参考这里。
2 个回答
0
问题出在 align='center'
这个属性上。把它去掉就行了。
10
我无法运行你给的代码片段,甚至经过一些修改后也无法复现那个大空白。除此之外,如果你想给matplotlib加个边框,可以这样做:
ax.set_xlim( min(your_data) - 10, None )
第一个参数告诉坐标轴在你的数据最小值的10个单位外放置边框,而None参数则表示保持当前的值。
为了让你更好理解:
from collections import Counter
from pylab import *
data = randint(20,size=1000)
res = Counter(data)
vals = arange(20)
ax = gca()
ax.bar(vals-0.4, [ res[i] for i in vals ], width=0.8)
ax.set_xlim( min(data)-1, None )
show()
我在StackOverflow上搜索时学到了一个新技巧:你可以调用
ax.margins( margin_you_desire )
这样matplotlib就会自动在你的图表周围留出一定的空间。你还可以在x轴和y轴上设置不同的空间。
在你的情况下,最好的解决方案可能是这样的:
ax.margins(0.01, None)
需要注意的是,这里的单位是坐标轴单位,跟你图表的大小有关,所以1个单位的边距会在你图表的两边留出和你当前图表一样大的空间。