質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

3409閲覧

Python matplotlibで積み上げグラフ

Mikya

総合スコア16

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/11/01 19:46

前提・実現したいこと

Python2.7.10でmatplotlibを用いて積み上げグラフを作図しています。
下記リンクを参考にしました。
Python matplotlibで棒グラフ(2軸グラフと積み上げグラフ)

途中はできたのですが、棒グラフの上にそれぞれの合計値であるデータラベルを付けたいのですが、何を追加したらいいのかわからないので教えていただきたいです。

途中まで作成したコード

python

1 2#モジュール読み込み 3import matplotlib.pyplot as plt 4import numpy as np 5 6#データ準備 7Case=np.array(['a','b','c','d','e','f']) 8a8=np.array([5.68, 6.90, 0.00, 3.45, 5.68, 27.59]) 9a7=np.array([5.68, 10.34, 3.41, 3.45, 6.82, 10.34]) 10a6=np.array([9.09,3.45,3.41, 6.90, 7.95, 3.45]) 11a5=np.array([4.55,13.79, 2.27, 0.00, 6.82, 3.45]) 12a4=np.array([6.82,10.34, 11.36, 6.90, 20.45, 13.79]) 13a3=np.array([11.36,10.34, 10.23, 6.90, 19.32, 3.45]) 14a2=np.array([6.82,0.00, 10.23, 6.90, 5.68, 3.45]) 15a1=np.array([6.82,6.90,4.55, 6.90,7.95, 0.00]) 16 17a87=a8+a7 18a65=a6+a5 19a432=a4+a3+a2 20 21xx=np.array([1,2,4,5,7,8]) 22 23#作図領域定義 24fsz=14 25fig=plt.figure(figsize=(10,10),facecolor='w') 26plt.rcParams["font.size"] = fsz 27plt.subplot(111) 28plt.xticks(xx,Case) 29plt.xlim(0,9) 30plt.ylim(0,100) 31plt.xlabel('purpose') 32plt.ylabel('ratio') 33plt.grid(color='#999999',linestyle='--') 34 35#積み上げプロット 36b0=np.array([0,0,0,0,0,0]) 37b1=b0+a1 38b2=b1+a432 39b3=b2+a65 40b4=b3+a87 41plt.bar(xx,a78,bottom=b3,width=0.8,align='center',label='several times a year',color="dimgray") 42plt.bar(xx,a65,bottom=b2,width=0.8,align='center',label='several times a month',color="darkgray") 43plt.bar(xx,a432,bottom=b1,width=0.8,align='center',label='several times a week',color="lightgray") 44plt.bar(xx,a1,bottom=b0,width=0.8,align='center',label='almost everyday',color="whitesmoke") 45 46#凡例とタイトル描画 47plt.legend(shadow=True,loc='upper left') 48plt.title('frequency',loc='left',fontsize=14) 49 50#画像の保存 51fnameF='frequency.png' 52plt.tight_layout() 53plt.savefig(fnameF, dpi=100, bbox_inches="tight", pad_inches=0) 54plt.show() 55

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問のコードにトータルの描画部を追記してみました
やりたいことは、これであってますでしょうか?

Python

1#モジュール読み込み 2import matplotlib.pyplot as plt 3import numpy as np 4 5#データ準備 6Case=np.array(['a','b','c','d','e','f']) 7a8=np.array([5.68, 6.90, 0.00, 3.45, 5.68, 27.59]) 8a7=np.array([5.68, 10.34, 3.41, 3.45, 6.82, 10.34]) 9a6=np.array([9.09,3.45,3.41, 6.90, 7.95, 3.45]) 10a5=np.array([4.55,13.79, 2.27, 0.00, 6.82, 3.45]) 11a4=np.array([6.82,10.34, 11.36, 6.90, 20.45, 13.79]) 12a3=np.array([11.36,10.34, 10.23, 6.90, 19.32, 3.45]) 13a2=np.array([6.82,0.00, 10.23, 6.90, 5.68, 3.45]) 14a1=np.array([6.82,6.90,4.55, 6.90,7.95, 0.00]) 15 16a87=a8+a7 17a65=a6+a5 18a432=a4+a3+a2 19 20xx=np.array([1,2,4,5,7,8]) 21 22#作図領域定義 23fsz=14 24fig=plt.figure(figsize=(10,10),facecolor='w') 25plt.rcParams["font.size"] = fsz 26plt.subplot(111) 27plt.xticks(xx,Case) 28plt.xlim(0,9) 29plt.ylim(0,100) 30plt.xlabel('purpose') 31plt.ylabel('ratio') 32plt.grid(color='#999999',linestyle='--') 33 34#積み上げプロット 35b0=np.array([0,0,0,0,0,0]) 36b1=b0+a1 37b2=b1+a432 38b3=b2+a65 39b4=b3+a87 40p1 = plt.bar(xx,a87,bottom=b3,width=0.8,align='center',label='several times a year',color="dimgray") 41p2 = plt.bar(xx,a65,bottom=b2,width=0.8,align='center',label='several times a month',color="darkgray") 42p3 = plt.bar(xx,a432,bottom=b1,width=0.8,align='center',label='several times a week',color="lightgray") 43p4 = plt.bar(xx,a1,bottom=b0,width=0.8,align='center',label='almost everyday',color="whitesmoke") 44 45#凡例とタイトル描画 46plt.legend(shadow=True,loc='upper left') 47plt.title('frequency',loc='left',fontsize=14) 48 49#トータル数を描画 50print(b4) 51for r1,r2,r3,r4,val in zip(p1,p2,p3,p4,b4): 52 x = r1.get_x() + (r1.get_width() / 2) 53 y = r1.get_height() + r2.get_height() + r3.get_height() + r4.get_height() 54 plt.text(x, y, '{:.2f}'.format(val), ha = 'center', va='bottom') 55 56#画像の保存 57fnameF='frequency.png' 58plt.tight_layout() 59plt.savefig(fnameF, dpi=100, bbox_inches="tight", pad_inches=0) 60plt.show()

イメージ説明


###追記

よくよく考えたらもっと簡単になりますね・・・
各バーの X値とY値(Total値)は既に求まっているので特に計算しなくても

Python

1#トータル数を描画 2for x, y in zip(xx, b4): 3 plt.text(x, y, '{:.2f}'.format(y), ha = 'center', va='bottom')

だけで良いかもです

投稿2018/11/01 23:40

編集2018/11/02 01:01
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mikya

2018/11/02 07:37

ありがとうございました。希望していたグラフが完成しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問