在条形和Y轴之间添加填充

时间:2013-03-14 19:14:28

标签: python matplotlib

我正在使用matplotlib使用下面的代码构建条形图。当我的第一列或最后一列数据为0时,我的第一列与Y轴楔入。

这方面的一个例子。请注意,第一列是在x = 0点上。

Zero first column

如果我在此列中有数据,我会在Y轴和第一列之间得到一个巨大的填充,如此处所示。注意附加条,现在在X = 0。如果我在上一栏中也有数据,则会重复此效果。 Non-zero first column

我的代码如下:

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轴和我的第一个/最后一个条之间设置一个恒定的边距?

此外,我意识到它被标记为“演示直方图”,这是因为我在纠正所讨论的问题here时错过了它。

2 个答案:

答案 0 :(得分:9)

我无法运行您提供的代码段,即使进行了一些修改,我也无法复制大空间。除此之外,如果你需要强制执行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会在你的地块周围留出空间,两个尺寸都大到你现在的情节

答案 1 :(得分:0)

问题是align='center'。删除它。