6

Python で matplotlib を使用して棒グラフを作成していますが、重なり合う棒に少し問題があります。

import numpy as np
import matplotlib.pyplot as plt

a = range(1,10)
b = range(4,13)
ind = np.arange(len(a))
width = 0.65

fig = plt.figure()
ax = fig.add_subplot(111)

ax.bar(ind+width, a, width, color='#b0c4de')

ax2 = ax.twinx()
ax2.bar(ind+width+0.35, b, 0.45, color='#deb0b0')

ax.set_xticks(ind+width+(width/2))
ax.set_xticklabels(a)

plt.tight_layout()

バープロット

赤いバーではなく、青いバーを前面に表示したい。これまでのところ、ax と ax2 を切り替えることができた唯一の方法でしたが、ylabels も逆になり、これは望ましくありません。axの前にax2をレンダリングするようにmatplotlibに指示する簡単な方法はありませんか?

さらに、右側の ylabels は plt.tight_layout() によって切り取られています。tight_layout を使用している間にこれを回避する方法はありますか?

4

1 に答える 1

8

おそらく、私が知らないより良い方法があるでしょう。ただし、対応する-ticksの場所をスワップしたり、スワップしたりすることもできますaxax2y

ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")

import numpy as np
import matplotlib.pyplot as plt

a = range(1,10)
b = range(4,13)
ind = np.arange(len(a))
width = 0.65

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(ind+width+0.35, b, 0.45, color='#deb0b0')

ax2 = ax.twinx()
ax2.bar(ind+width, a, width, color='#b0c4de')

ax.set_xticks(ind+width+(width/2))
ax.set_xticklabels(a)

ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")

plt.tight_layout()
plt.show()

ここに画像の説明を入力


ちなみに、自分で計算する代わりに、align='center'パラメータを使用してバーを中央に配置できます。

import numpy as np
import matplotlib.pyplot as plt

a = range(1,10)
b = range(4,13)
ind = np.arange(len(a))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(ind+0.25, b, 0.45, color='#deb0b0', align='center')

ax2 = ax.twinx()
ax2.bar(ind, a, 0.65, color='#b0c4de', align='center')

plt.xticks(ind, a)
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")

plt.tight_layout()
plt.show()

(結果は基本的に上記と同じです。)

于 2013-02-14T20:40:48.463 に答える