3

前の質問と同じコードを使用して、このサンプルは以下のグラフを生成します。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

data = (0, 1890,865, 236, 6, 1, 2, 0 , 0, 0, 0 ,0 ,0 ,0, 0, 0)
ind = range(len(data))
width = 0.9   # the width of the bars: can also be len(x) sequence

p1 = plt.bar(ind, data, width)
plt.xlabel('Duration 2^x')
plt.ylabel('Count')
plt.title('DBFSwrite')
plt.axis([0, len(data), -1, max(data)])

ax = plt.gca()

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

plt.savefig('myfig')

サンプル出力

目盛りラベルが 0、2、4、6、8 の代わりに...すべてのマークにラベルを付けて、2^x の値で処理を進めたいと思います: 1、2、4、8、16 など。 どうやってやるの?さらに良いことに、ラベルを左端ではなく、バーの下の中央に配置できますか?

4

2 に答える 2

5

xticks()あなたが望むものです:

# return locs, labels where locs is an array of tick locations and
# labels is an array of tick labels.
locs, labels = xticks()

# set the locations of the xticks
xticks( arange(6) )

# set the locations and labels of the xticks
xticks( arange(5), ('Tom', 'Dick', 'Harry', 'Sally', 'Sue') )

したがって、1..4 で x の 2^x の目盛りを設定するには、次のようにします。

tick_values = [2**x for x in arange(1,5)]

xticks(tick_values,[("%.0f" % x)  for x in tick_values])

ラベルをバーの左ではなく中央に配置するには、align='center'を呼び出すときに を使用しbarます。

結果は次のとおりです。

結果のグラフ

于 2013-08-28T19:15:09.183 に答える
5

これを実現する 1 つの方法は、Locatorとを使用することFormatterです。これにより、目盛りを「失う」ことなくプロットをインタラクティブに使用できます。この場合、以下の例に示すようにお勧めMultipleLocatorFuncFormatterます。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter

data = (0, 1890,865, 236, 6, 1, 2, 0 , 0, 0, 0 ,0 ,0 ,0, 0, 0)
ind = range(len(data))
width = 0.9   # the width of the bars: can also be len(x) sequence

# Add `aling='center'` to center bars on ticks
p1 = plt.bar(ind, data, width, align='center')
plt.xlabel('Duration 2^x')
plt.ylabel('Count')
plt.title('DBFSwrite')
plt.axis([0, len(data), -1, max(data)])

ax = plt.gca()

# Place tickmarks at every multiple of 1, i.e. at any integer
ax.xaxis.set_major_locator(MultipleLocator(1))
# Format the ticklabel to be 2 raised to the power of `x`
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: int(2**x)))
# Make the axis labels rotated for easier reading
plt.gcf().autofmt_xdate()

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

plt.savefig('myfig')

ここに画像の説明を入力

于 2013-08-28T20:13:47.900 に答える