1

以下のコードを使用して、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 軸と最初/最後のバーの間に一定のマージンを設定するにはどうすればよいですか?

さらに、「デモ ヒストグラム」というラベルが付けられていることに気付きました。これは、ここで説明した問題を修正するときに見逃したためです。

4

2 に答える 2

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

スタックオーバーフローを検索して、新しいトリックを学びました。呼び出すことができます

ax.margins( margin_you_desire )

自動的に matplotlib がプロットの周りにその量のスペースを配置できるようにします。また、x と y の間で異なる構成にすることもできます。

あなたの場合、最善の解決策は次のようなものです

ax.margins(0.01, None)

ちょっとした問題は、単位が軸単位であり、プロットのサイズを参照しているため、マージンが 1 の場合、現在のプロットと同じ大きさの両方のサイズでプロットの周りにスペースが配置されることです。

于 2013-03-14T19:28:08.457 に答える