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

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

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

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Matplotlib

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

pandas

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

Q&A

解決済

1回答

953閲覧

pandasとmatplotlibで複数のデータフレームから積み上げ棒グラフを作成したい。

karakarakarappo

総合スコア28

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Matplotlib

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

pandas

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

0グッド

0クリップ

投稿2022/06/08 15:26

pandasでデータフレームを複数作成し、matplotlibで作図したいと考えています。

実現したい内容

丁度以下の2枚の画像を合体し、プラスとマイナスを-20,000~20,000の範囲で、凡例を表示した画像にしたいです。

イメージ説明

イメージ説明

同じaxに対して、.barをすれば良いのでは?という考えでコードを記載しましたが、以下のError文で弾かれてしまいます。
今後表の微調整も行いたいので、できればオブジェクト指向で作成したいなと考えています。

以下サンプルとしてご利用ください。

Error文

1TypeError: 'AxesSubplot' object is not subscriptable

python

1import pandas as pd 2from io import StringIO 3import matplotlib.pyplot as plt 4 5# テストデータ 6s = """列1,trade_date,product_class,instrument_id,instrument,broker_code,broker_name,item,volume 712,20220606,A,60018,A 2206,11560,G,SELL,181.0 838,20220606,A,90018,A 2209,11560,G,SELL,1.0 956,20220606,AA,60019,AA 2206,11560,G,SELL,395.0 1084,20220606,B,60005,B 2206,11560,G,SELL,1895.0 11103,20220606,B,90005,B 2209,11560,G,SELL,1179.0 128282,20220531,A,60018,A 2206,11560,G,BUY,153.0 1356,20220606,AA,60019,AA 2206,11560,G,BUY,395.0 148282,20220531,A,60018,A 2206,11560,G,SELL,153.0 158305,20220531,AA,10019,AA 2206,11560,G,SELL,8129.0 168345,20220531,B,10005,BB 2206,11560,G,SELL,5708.0 178638,20220531,A,60018,A 2206,11560,G,SELL,556.0 188662,20220531,B,60005,B 2206,11560,G,SELL,5862.0 199995,20220606,A,60018,A 2206,11560,G,SELL,50.00 209996,20220606,AA,90018,AA 2209,11560,G,BUY,150.00""" 21df = pd.read_csv(StringIO(s), dtype={'trade_date':str}) 22 23#データフレームに計算式を入れる 24 25df.loc[df['item']=='SELL', 'volume'] *= -1 26df.loc[df['product_class']=='AA', 'volume'] *= 0.1 27 28df_1 = df[(df['product_class']=='AA') | (df['product_class']=='A')] 29df_1 = df[(df['product_class']=='AA') | (df['product_class']=='A')] 30 31input_csv_GOLD_BUY =df_1[df_1["item"] == "BUY"] 32 33input_csv_GOLD_SELL =df_1[df_1["item"] == "SELL"] 34 35df_BUY = input_csv_GOLD_BUY.groupby(['trade_date', 'instrument'])['volume'].sum().unstack('instrument').plot(kind='bar', stacked=True) 36df_SELL = input_csv_GOLD_SELL.groupby(['trade_date', 'instrument'])['volume'].sum().unstack('instrument').plot(kind='bar', stacked=True) 37

以上、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1from matplotlib import colors as mc 2inst = df_1['instrument'].drop_duplicates().sort_values().values 3colors = dict(zip(inst, mc.TABLEAU_COLORS)) 4ax = input_csv_GOLD_BUY.groupby(['trade_date', 'instrument'])['volume'].sum().unstack('instrument').plot(kind='bar', stacked=True, color=colors) 5input_csv_GOLD_SELL.groupby(['trade_date', 'instrument'])['volume'].sum().unstack('instrument').plot(kind='bar', stacked=True, color=colors, ax=ax) 6 7handles, labels = ax.get_legend_handles_labels() 8legend = sorted(zip(handles, labels), key=lambda t: t[1]) 9labels.sort() 10uniq = [(h, l) for i, (h, l) in enumerate(legend) if l not in labels[:i]] 11plt.gca().legend(*zip(*uniq)) 12plt.axhline(y=0, linewidth=0.5, color='k') 13 14plt.show()

イメージ説明

投稿2022/06/09 06:25

melian

総合スコア19761

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

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

karakarakarappo

2022/06/10 12:23

コメント頂きありがとうございます。 可能でしたら、以下の部分について詳細をご教授いただけないでしょうか。 ① uniq = [(h, l) for i, (h, l) in enumerate(legend) if l not in labels[:i]] 重複要素の削除をしているのは理解できました。 for文で変数iと(h,l)(英字小文字のえる)を設定し、enumerate()関数を使ったforループでインデックス番号, 要素の順に取得しているように思われます。 if l not in labels[:i]]と記載することで、変数iに重複が出るまでforループを回している、という理解で良いのでしょうか。 ② plt.gca().legend(*zip(*uniq)) .legendで凡例を表示しているのは理解できました。 plt.gca().に関しては、Pyplotインターフェースからオブジェクト指向インターフェースに切り替えるために使っているということで良いのでしょうか。 また、アスタリスクがある理由ですが、リストにアスタリスク * を付けて関数に渡しているということでしょうか?uniqのリストの要素をひとつひとつ取り出して、zip関数に(リストを作る関数)アスタリスクを適用させているという理解で間違いないでしょうか。 plt.gca().legend(*uniq)ですと、以下のようにErrorがでますので、そのような思考になりました。 TypeError: legend only accepts two non-keyword arguments 以上、よろしくお願いします。
melian

2022/06/10 23:48

全て Yes.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問