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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

640閲覧

各要素のカウント数を横軸積み上げ棒グラフで図示したい

KYuki1218

総合スコア26

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/06/15 09:33

編集2023/06/15 12:11

実現したいこと

現在,様々なサイトを参考に,1つの要素(教科)を積み上げ棒グラフで図示することはできているのですが(ただ凡例は表示されず),これを指定した要素全てで横軸積み上げ棒グラフにまとめたいです。

修正点

ご指摘をいただき,横軸積み上げ棒グラフにして,2つまでの要素を図示できました。英語を同様に追加するとエラーが出てしまうため,3つ以上で図示する方法をご教示いただきますと嬉しい限りです。

データの詳細

使用するデータは,下記のような授業アンケートで,各教科に対して「満足」「やや満足」「どちらとも言えない」「やや不満」「不満」という回答が格納されております。

生徒ID性別国語数学英語社会理科
1男性満足やや満足満足どちらとも言えないやや不満
2男性不満満足満足不満満足
3女性やや満足満足満足不満やや不満
100女性満足どちらとも言えないやや不満満足やや満足

該当のソースコード

python

1import matplotlib.pyplot as plt 2import japanize_matplotlib 3 4# カテゴリの順番を定義 5category_order = ["満足","やや満足","どちらとも言えない","やや不満","不満"] 6 7# カテゴリの順番に基づいてデータをソート 8tmp = df[["国語", "数学", "英語", "社会", "理科"]].apply(lambda x: x.value_counts(normalize=True)).reindex(category_order).reset_index() 9 10width = 0.4 # 棒の幅 11y = [1, 2] # y軸の位置 12 13left1 = 0 14left2 = 0 15colors = ["skyblue", "steelblue", "deepskyblue", "royalblue", "lightsteelblue"] # 各カテゴリに対する色のリスト 16 17for i in range(tmp.shape[0]): 18 plt.barh(y[0], tmp["国語"][i], left=left1, height=width, label="国語", color=colors[i % len(colors)]) 19 plt.barh(y[1], tmp["数学"][i], left=left2, height=width, label="数学", color=colors[i % len(colors)]) 20 left1 += tmp["国語"][i] 21 left2 += tmp["数学"][i] 22 23plt.plot([0, 0], [0, 3], color='#00000000') 24plt.yticks(y, ["国語", "数学"]) 25 26# 凡例を表示 27#plt.legend() 28 29plt.show()

イメージ説明

試したこと

python

1left1 = 0 2left2 = 0 3left3 = 0 4colors = ["skyblue", "steelblue", "deepskyblue", "royalblue", "lightsteelblue"] # 各カテゴリに対する色のリスト 5 6for i in range(tmp.shape[0]): 7 plt.barh(y[0], tmp["国語"][i], left=left1, height=width, label="国語", color=colors[i % len(colors)]) 8 plt.barh(y[1], tmp["数学"][i], left=left2, height=width, label="数学", color=colors[i % len(colors)]) 9 plt.barh(y[2], tmp["英語"][i], left2=left3, height=width, label="英語", color=colors[i % len(colors)]) 10 left1 += tmp["国語"][i] 11 left2 += tmp["数学"][i] 12 left3 += tmp["英語"][i] 13 14plt.plot([0, 0], [0, 3], color='#00000000') 15plt.yticks(y, ["国語", "数学","英語"])

IndexError: list index out of range

補足

可能でしたら,下記画像のように(積み上げ棒グラフで)性別別に横軸積み上げ棒グラフを2つ並べられたらと嬉しいです…
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

一例を挙げておきます。

前提として、df は以下のように、生徒IDがindexになっているデータフレームになっていると仮定します。

python

1df.head()

イメージ説明

python

1df.shape

(100, 6)

各定数を設定します。バーの色を男女で異なるように用意しておきます。

python

1category_order = ["満足","やや満足","どちらとも言えない","やや不満","不満"] 2colors = { 3 "男性": ["skyblue", "steelblue", "deepskyblue", "royalblue", "lightsteelblue"], 4 "女性": ["#FF6200", "#FD7F2C", "#FD9346", "#FDA766", "#FDB777"], 5} 6width = 0.4

グラフを横に2つ並べるのであれば、plt.subplots メソッドで 2つのAxesオブジェクトを作り、各々に男女別のグラフを描画します。

python

1fig, axes_ary = plt.subplots(1,2) 2 3for i, gender in enumerate(df["性別"].unique()): 4 tmp = df.loc[df["性別"] == gender].drop("性別", axis=1).apply(lambda x: x.value_counts(normalize=True)).reindex(category_order) 5 for j, subject in enumerate(tmp.columns): 6 left = 0 7 for k, category in enumerate(category_order): 8 axes_ary[i].barh(j+1, tmp.loc[category, subject], left=left, height=width, label=subject, color=colors[gender][k]) 9 left += tmp.loc[category, subject] 10 11 axes_ary[i].set_yticks(range(1, len(tmp.columns)+1), tmp.columns) 12 axes_ary[i].set_title(gender) 13 14plt.show()

イメージ説明

投稿2023/06/15 14:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KYuki1218

2023/06/15 14:58

sealy様,ご丁寧にご教示いただきありがとうございます。 無事に所有しているデータでも実現できました!私一人では解決しない問題であったため非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問