3

matplotlib で積み上げ棒グラフを生成しています (Windows 7 で Python 2.7 を使用)。

2つのデータセットのデータをペアワイズ比較するために使用したいので、2番目のバーごとに異なる色を使用したいと思います. これを達成する方法を誰か教えてもらえますか?

私の棒グラフは基本的に次のようになります。

import numpy
import matplotlib.pyplot as plt


fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

IDs = ["1","A","2","B","3","C","4","D","5","E"]
N = len(IDs)

property1 = numpy.array([1,3,4,2,3,5,6,7,3,2])
property2 = numpy.array(range(10))
property3 = numpy.array(range(10,0,-1))

ind = numpy.arange(N)
width = 0.8

p1 = ax1.bar(ind, property1, width, color='red')
p2 = ax1.bar(ind, property2, width, color='blue', bottom=property1)
p3 = ax1.bar(ind, property3, width, color='green', bottom=property1 + property2)
plt.xticks(ind+width/2., IDs )

plt.show()
plt.close()

したがって、文字でラベル付けされたバーには 1 つの配色を使用し、数字でラベル付けされたバーには別の配色を使用したいと考えています (たとえば、「1」と「A」はペアを形成するため、2 つの異なる実験条件下で同じサンプルを表すため、隣に並べて欲しい)。

理想的には、ペアの棒の間にギャップを残さないように幅を調整できれば (ただしペア間のギャップは)、それは本当に素晴らしいことです。

でも、今はどうすればいいのかわからないので、アドバイスをいただければ幸いです。

(データの両方の「セット」を個別に使用できます。その方が簡単ですか?おそらく、互いに交差する広いギャップを持つ2つのプロットを実行しますか?)

4

2 に答える 2

5

スライスを使用すると、これをよりエレガントに行うことができます。おそらくより良い解決策は、データのインターレースを解除することです。

IDs = ["1","A","2","B","3","C","4","D","5","E"]

N = len(IDs)
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

set_count = 2
set_label = np.vstack([j*ones(len(IDs)//set_count) for j in range(set_count)]).T.ravel()

property1 = numpy.array([1,3,4,2,3,5,6,7,3,2])
property2 = numpy.array(range(10))
property3 = numpy.array(range(10,0,-1))

props = [property1,property2,property3]

ind = numpy.arange(N/set_count)
width = 0.9
b_width = 0.9/set_count

color_sets = [['red','green','blue'],['black','magenta','yellow']]

for j in range(set_count):
    tmp_accum = np.zeros(len(props[0]))
    for k in range(len(props)):
        ax1.bar(ind +j*b_width, props[k][set_label==j], width=b_width, color=color_sets[j][k], bottom=tmp_accum[set_label==j])
        tmp_accum += props[k]


lab_ind = []
for j in range(set_count):

    lab_ind.append(ind + (j+.5)*b_width)

plt.xticks(np.vstack(lab_ind).T.ravel(), IDs )

いくつかの健全性チェックが必要ですが、機能し、2 つ以上のクラスと 3 つ以上のプロパティに簡単にスケーリングする必要があります (すべての長さが同期されていることを確認する必要があるだけitertools.cycleで、色に使用すると役立つ場合があります)。

結果イメージ

于 2012-10-15T16:23:35.610 に答える
1

かなり洗練されていないように見えますが、機能する方法を見つけました。

import numpy
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

IDs = ["1","A","2","B","3","C","4","D","5","E"]

N = len(IDs)

property1_1 = numpy.array([1,0,4,0,3,0,6,0,3,0])
property1_2 = numpy.array([0,3,0,2,0,5,0,7,0,2])
property2_1 = numpy.array([1,0,2,0,3,0,4,0,5,0])
property2_2 = numpy.array([0,6,0,7,0,8,0,9,0,10])
property3_1 = numpy.array([10,0,9,0,8,0,7,0,6,0])
property3_2 = numpy.array([0,5,0,4,0,3,0,2,0,1])

ind = numpy.arange(N)
width = 0.8

p1 = ax1.bar(ind, property1_1, width, color='red')
p2 = ax1.bar(ind, property2_1, width, color='blue', bottom=property1_1)
p3 = ax1.bar(ind, property3_1, width, color='green', bottom=property1_1 + property2_1)

p4 = ax1.bar(ind-0.2, property1_2, width, color='#FF6666')
p5 = ax1.bar(ind-0.2, property2_2, width, color='#6699FF', bottom=property1_2)
p6 = ax1.bar(ind-0.2, property3_2, width, color='#33CC33', bottom=property1_2+property2_2)
plt.xticks(ind+width/2., IDs )

plt.show()
plt.close()

これは、この問題を抱えている他の人のために私が行った方法です。これは最適ではないと思います。追加の回答をいただければ幸いです。

于 2012-10-15T11:41:04.223 に答える