質問するログイン新規登録

Q&A

解決済

1回答

395閲覧

plotlyでⅹ軸が連動した水平積上げグラフを作りたい

sandu

総合スコア12

Python

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

Plotly

Plotlyとは、インタラクティブなグラフの作成するためのオープンソースライブラリです。線グラフ・散布図・ヒストグラム・ヒートマップといったグラフだけではなく、3Dグラフやアニメーションの作成も可能です。

0グッド

0クリップ

投稿2023/10/01 02:02

編集2023/10/01 04:31

0

0

実現したいこと

2つのグラフを別々に表示した場合は水平積上げグラフになっているのですが、make_subplotsで連動すると連動はできても積上げグラフになりません。
どうしたら「2つのグラフでⅹ軸が連動した水平積上げグラフ」が作れるのか分かりませんので、ご教示お願い致します。

該当のソースコード

Python

1import pandas as pd 2import plotly.graph_objs as go 3import plotly.io as pio 4from plotly.subplots import make_subplots 5 6df1 = pd.DataFrame(data=(["X",5.5, 7.5, 3],), 7 columns=["種類", "工程1", "工程2", "工程3"] 8 ) 9 10df2 = pd.DataFrame(data=(["A",10, 12.1, 5.5], ["B", 3.3, 6, 9.5], ["C", 8.2, 0 ,2]), 11 columns=["種類", "工程1", "工程2", "工程3"] 12 ) 13 14df1 = df1.set_index('種類') 15df2 = df2.set_index('種類')

df1:
イメージ説明
df2:
イメージ説明

Python

1fig = make_subplots(rows=2, cols=1, shared_xaxes=True) 2 3data1 = [go.Bar(y=df1.index, 4 x=df1.iloc[:, i], 5 name=df1.columns[i], 6 orientation="h" 7 ) 8 for i in range(len(df1.columns))] 9 10 11data2 = [go.Bar(y=df2.index, 12 x=df2.iloc[:, i], 13 name=df2.columns[i], 14 orientation="h") 15 for i in range(len(df2.columns))] 16 17fig.add_trace(data1[0],1,1) 18fig.add_trace(data2[0],2,1) 19 20fig.update_layout(title="連動グラフ", 21 barmode="stack", 22 width=400, height=300, 23 margin=go.layout.Margin(l=0, r=0, b=0, t=30), 24 ) 25fig.show()

積上げグラフにならず、凡例も工程1しか表示されない。
イメージ説明

試したこと

個別で表示した場合は積上げグラフになっています。

Python

1data1 = [go.Bar(y=df1.index, 2 x=df1.iloc[:, i], 3 name=df1.columns[i], 4 orientation="h") 5 for i in range(len(df1.columns))] 6layout = go.Layout( 7 title=go.layout.Title(text="連動グラフ"), 8 xaxis=go.layout.XAxis(title=df1.index.name), 9 yaxis=go.layout.YAxis(title="時間"), 10 barmode="stack", 11 width=400, height=300, 12 margin=go.layout.Margin(l=0, r=0, b=0, t=30), 13 14) 15fig1 = go.Figure(data=data1, layout=layout) 16# fig.update_traces(orientation="h") 17fig1.show() 18 19data2 = [go.Bar(y=df2.index, 20 x=df2.iloc[:, i], 21 name=df2.columns[i], 22 orientation="h") 23 for i in range(len(df2.columns))] 24layout = go.Layout( 25 title=go.layout.Title(text="連動グラフ"), 26 xaxis=go.layout.XAxis(title=df2.index.name), 27 yaxis=go.layout.YAxis(title="時間"), 28 barmode="stack", 29 width=400, height=300, 30 margin=go.layout.Margin(l=0, r=0, b=0, t=30), 31 32) 33fig2 = go.Figure(data=data2, layout=layout) 34# fig.update_traces(orientation="h") 35fig2.show()

以下のようなグラフの状態で連動できるようにしたい。

イメージ説明
イメージ説明

追加

add_traceのところを修正したところ積上げグラフにはなりましたが、
凡例がダブっている。
凡例を工程1,工程2,工程3のようにしたい。

python

1# fig.add_trace(data1[0],1,1) 2# fig.add_trace(data2[0],2,1) 3# 以下のように修正 4for i in range(len(data1)): 5 fig.add_trace(data1[i],1,1) 6 fig.add_trace(data2[i],2,1)

イメージ説明

補足情報(FW/ツールのバージョンなど)

python = 3.10.12
pandas = 2.0.3
plotly = 5.9.0

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

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

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

guest

回答1

0

自己解決

自己解決しました。

python

1fig = make_subplots(rows=2, cols=1, shared_xaxes=True) 2 3colorlist = ['red', 'green', 'yellow'] # 追加 4 5data1 = [go.Bar(y=df1.index, 6 x=df1.iloc[:, i], 7 name=df1.columns[i], 8 orientation="h", 9 legendgroup="group1", 10 marker_color=colorlist[i], #追加 11 ) 12 for i in range(len(df1.columns))] 13 14 15data2 = [go.Bar(y=df2.index, 16 x=df2.iloc[:, i], 17 name=df2.columns[i], 18 orientation="h", 19 legendgroup="group2", 20 marker_color=colorlist[i], #追加 21 ) 22 for i in range(len(df2.columns))] 23 24for i in range(len(data1)): 25 fig.add_trace(data1[i],1,1) 26 fig.add_trace(data2[i],2,1) 27 28 29fig.update_layout(title="連動グラフ", 30 barmode="stack", 31 width=400, height=300, 32 margin=go.layout.Margin(l=0, r=0, b=0, t=30), 33 ) 34 35fig.show()

イメージ説明

投稿2023/10/01 09:07

sandu

総合スコア12

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問