2013-03-14 57 views
1

我使用下面的代码使用matplotlib构建条形图。当我的第一列或最后一列数据为0时,我的第一列被楔入Y轴。在条形图和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时我错过了它。

回答

9

我不能运行你给出的代码片段,即使有一些修改,我无法复制大空间。除此之外,如果你需要强制执行边界matplotlib,你CA做财产以后这样的:

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() 

摸索计算器我只学会了一个新把戏:你可以打电话

ax.margins(margin_you_desire) 

让自动让matplotlib放的空间量在你的阴谋。它也可以在x和y之间进行不同的配置。

在你的情况下,最好的解决办法是这样的

ax.margins(0.01, None) 

小美中不足的是,本机在轴单位,提到了你的尺寸的情节,所以1保证金会把周围空间你的情节在两个大小都很大,因为你现在的情节很大

0

问题是align='center'。去掉它。