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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2876閲覧

Matplotlibによる積み上げ棒グラフ内の数値表示と欠損値削除

ka1111

総合スコア1

Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/08/17 08:21

編集2020/08/17 08:30

前提・実現したいこと

①matplotlibを利用して次のPandasDataFlameを積み上げ棒グラフとして表示。

Python

1df = pd.DataFrame({'会社':["トヨタ","ホンダ","日産","スズキ","GM","その他"], 2 'SUV':[30,0,10,15,0,30], 3 'ワゴン': [0,30,0,40,45,0], 4 'セダン': [50,25,30,45,0,25]})

②棒グラフの中に数字を記入
③ただし、欠損値(0)は表示しない

発生している問題・エラーメッセージ

①は問題ないのですが ②棒グラフの中に数字を記入 ③ただし、欠損値(0)は表示しない がどうしてもうまくできません。

該当のソースコード

import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({'会社':["トヨタ","ホンダ","日産","スズキ","GM","その他"], 'SUV':[30,0,10,15,0,30], 'ワゴン': [0,30,0,40,45,0], 'セダン': [50,25,30,45,0,25]}) df = df.set_index('会社') ax = plt.subplot() df.plot.bar(stacked=True, color=['black', 'green', 'red'], ax=ax) ax.set_ylabel('金額') for p in ax.patches: ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005),color = "w")

試したこと

https://teratail.com/questions/234747
を参照してax.textでの記載も試したのですが、座標取得がどうしてもうまくできません。

https://stackoverflow.com/questions/25447700/annotate-bars-with-values-on-pandas-bar-plots

の回答にあるax.patchesとax.annotateの方がシンプルそうだったので、
試していたのですが手詰まりになってしまいました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

欠損値(0)は表示しない

rect.get_height() > 0 のときだけラベルを表示するようにすればいいと思います。

参考: matplotlib - 積み上げ棒グラフを作成する方法 - pystyle

python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4df = pd.DataFrame( 5 { 6 "SUV": [30, 0, 10, 15, 0, 30], 7 "ワゴン": [0, 30, 0, 40, 45, 0], 8 "セダン": [50, 25, 30, 45, 0, 25], 9 }, 10 index=["トヨタ", "ホンダ", "日産", "スズキ", "GM", "その他"], 11) 12 13ax = plt.subplot() 14df.plot.bar(stacked=True, color=["black", "green", "red"], ax=ax) 15ax.set_ylabel("金額") 16 17for rect in ax.patches: 18 if rect.get_height() > 0: 19 cx = rect.get_x() + rect.get_width() / 2 20 cy = rect.get_y() + rect.get_height() / 2 21 value = f"{rect.get_height():.0f}" 22 ax.text(cx, cy, value, color="w", ha="center", va="center")

イメージ説明

投稿2020/08/17 08:38

tiitoi

総合スコア21956

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

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

ka1111

2020/08/17 08:44

迅速かつシンプルで大変助かりました。 延々とネットで回答を探し回っていたのですが、参考サイトにたどり着くことが全然できませんでした・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問