質問するログイン新規登録
Python 3.x

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

Python

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

Q&A

解決済

1回答

1033閲覧

Python上で複数の要素を持つ棒グラフを描きたい【追記】

yzsdk

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/04/12 05:55

編集2022/04/14 00:58

0

0

実現したいこと

下のようなcsvから、Q1とQ2をAとBの平均値で比較するような棒グラフを描きたいです。
イメージ説明
上記の図はExcelで作成しているのでExcelで作成してしまえばいいのですが、
示したcsv例は全体の一部のため、Pythonでなんとか効率化できないかと考えています。

やってみたこと

python

1sns.barplot(x='列Q', y='列A', data=df2)

とし、Q1とQ2の列A,列Bそれぞれで棒グラフが描けるところまではできました。
列A,Bそれぞれの棒グラフを1つの軸上で表現したいのです。

https://www.codexa.net/seaborn-python/
の「棒グラフを描く −平均値を可視化する−」を参考に……とも考えたのですが、
そもそものデータ構造が異なるためうまくこちらのやりたい形に書き換えられませんでした。
また、
https://tokitsubaki.com/python-matplotlib-bar-graph/552/
の「複数の棒グラフを表示する方法」を参考に
幅をずらしてみる形も試したのですが、こちらも手持ちのデータ構造が異なるため、うまくこちらのやりたい形に落とし込めませんでした。
(y軸部分に
A

B
と表示され、棒は片方だけになってしまいました)

知りたいこと
データ構造を変えない場合、どのような形でグラフを描く指示を記述するのが良いでしょうか。
(現在の列A,列B,列Qの形から、参考にしたサイトのようなデータの形に変形するのがスムーズでしょうか)

よろしくお願いします。

列A列B列Q
0.1434794180.434606504Q1
0.5269789670.335625096Q2
0.3007066030.10525551Q1
0.5565292590.227195416Q2
0.7162695450.874288775Q1
0.381475350.614077424Q2
0.199467810.573008082Q1
0.3168826750.077498148Q2
0.4277298220.723043906Q1
0.0624261640.905506978Q2
0.153720350.331729346Q1
0.8799882080.982075577Q2
0.5831721630.937667393Q1
0.2033510690.106217671Q2
0.3250723630.782268672Q1
0.3820872620.7997886Q2
0.3147424250.010230592Q1
0.5690158210.496844197Q2
0.6883808410.487077471Q1
0.6269924470.399904693Q2

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

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

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

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

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

bsdfan

2022/04/13 13:16

> データ構造を変えない場合、どのような形でグラフを描く指示を記述するのが良いでしょうか。 データ構造を変えないというのはどういう意味で書かれていますか? グラフをプロットするためのライブラリ(seabornなりmatplotlibなり)は、どんな形のデータでも受け付けるわけではないので、対応する形にデータを変形させることは必要です。
yzsdk

2022/04/14 00:55

コメントありがとうございます。 グラフを作るとき、「x軸はこの行を参照、y軸はこの行を参照、この行を参照してサンプルごとに、こういう位置にプロットする」 という指示をプログラムでしている……という認識なのですが、 そういう指示をするためには例に挙げたようなcsvの形のままではできず、 ご指摘いただいたようなデータの変形が必要なのでしょうか。 理解が間違っていたら申し訳ありません。
guest

回答1

0

ベストアンサー

今のデータ構造を変える必要はないですが、プロットするために、プロットのツールに合わせたデータの加工は必要になります。

python

1import pandas as pd 2import numpy as np 3import seaborn as sns 4import matplotlib.pyplot as plt 5 6df = pd.DataFrame({ 7 'A': [0.143479418, 0.526978967, 0.300706603, 0.556529259, 0.716269545, 0.38147535, 0.19946781, 0.316882675, 0.427729822, 0.062426164, 0.15372035, 0.879988208, 0.583172163, 0.203351069, 0.325072363, 0.382087262, 0.314742425, 0.569015821, 0.688380841, 0.626992447], 8 'B': [0.434606504, 0.335625096, 0.10525551, 0.227195416, 0.874288775, 0.614077424, 0.573008082, 0.077498148, 0.723043906, 0.905506978, 0.331729346, 0.982075577, 0.937667393, 0.106217671, 0.782268672, 0.7997886, 0.010230592, 0.496844197, 0.487077471, 0.399904693], 9 'Q': ['Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2'] 10})

seaborn.boxplot の場合

ドキュメントをみると、hueを使ったプロットにはlong-form(縦持ち)のデータフレームを渡す必要があるとのことです。
今回のケースで pandasで縦持ちのデータに変換するには pandas.melt() が使えます。

python

1df_plot = pd.melt(df, id_vars='Q', value_vars=['A', 'B'], var_name='var', value_name='val') 2sns.barplot(x='var', y='val', hue='Q', data=df_plot)

matplotlib の bar を使う場合

matplotlib の bar では、事前に平均値を計算する必要があります。
groupby して mean で平均をとります。

python

1mean = df.groupby('Q').mean() 2 3w = 0.3 4x = np.arange(2) 5plt.bar(x - w / 2, mean.loc['Q1'], w, label='Q1') 6plt.bar(x + w / 2, mean.loc['Q2'], w, label='Q2') 7 8plt.xticks(x, ['A', 'B'])

シンプルな方法

こだわりがなければ(平均をプロットしたいだけなら)、pandas.DataFrame.plot を使うのが簡単です。
上と同じでgroupbyしてmeanをとって、plot すればいいです。(QでわけるためにTを使って転置しています)

python

1mean = df.groupby('Q').mean() 2mean.T.plot(kind='bar')

投稿2022/04/14 10:55

bsdfan

総合スコア4925

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

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

yzsdk

2022/04/21 06:26

反応が遅くなって申し訳ありませんでした。無事作ることができました。 今回実現したいこととして書いたのが棒グラフでしたが、箱ひげ等にもできたらいいなぁという目論見がありましたので、seaborn.boxplot の形を参考にさせていただくことにしました。列A・B以外の列もありましたので、それぞれデータを変更し、またx軸y軸も記入することで思ったようなグラフが描けました。 今後はライブラリのページも見ながら試してみたいと思います。 本当に助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問