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

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

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

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

Q&A

解決済

2回答

4260閲覧

plotlyで2つのグラフを重ねて表示したときにx軸を揃えて表示したい

murmur1975

総合スコア34

Python

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

0グッド

0クリップ

投稿2018/09/12 10:38

以下のソースを実行すると、グラフ自体がピッタリ重なって表示され、x軸がy軸方向にちょうどバイアス分の+1だけずれて表示されます。

python3

1import plotly 2import numpy as np 3 4T= 0.5 5N = 2501 6x_t = np.linspace(0, T, N)#時間軸 7 8a = np.sin(2*np.pi*10*x_t) 9b = a + 1 #バイアスをかける 10 11trace1 = plotly.graph_objs.Scatter( 12 x=x_t, 13 y=a 14 ) 15trace2 = plotly.graph_objs.Scatter( 16 x=x_t, 17 y=b, 18 yaxis="y2" 19) 20p_data=[trace1, trace2] 21p_layout = plotly.graph_objs.Layout( 22 title=memfile, 23 xaxis=dict( 24 title="time[s]" 25 ), 26 yaxis=dict( 27 title="a", 28 ), 29 yaxis2=dict( 30 title="b", 31 overlaying="y", 32 side="right" 33 ), 34) 35fig = plotly.graph_objs.Figure(data=p_data, layout=p_layout) 36plotly.offline.plot(fig)

実現したいことは以下の2つです。

  1. マウスで動かせば、2つのグラフのx軸を揃えられますが、デフォルト状態でx軸を揃えて表示したい。
  2. さらに、マウスで拡大縮小などをした際にも、x軸は揃ったままにしたい。

とにかく、どんな操作をしてもx軸は揃ったままに(y=0の点を維持したい;下図のような感じ)したいということです。
イメージ説明
わかる方、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

x軸(y=0のライン)を揃えたいとのことですが、overlaying='y'のオプションは、もともとそういった使い方を想定してなさそうです。

参考:Plotly.js - How do I make two y-axes associated with a single x-axis? - plotly.js - Plotly Forum

解決策としては、とりあえず、Layoutで範囲指定するというのはどうでしょうか?
上のリンク先でも同様の方法で解決してますが、
以下のような感じで。rangeのオプションで範囲指定ができます。

python

1p_layout = plotly.graph_objs.Layout( 2 title="", 3 xaxis=dict( 4 title="time[s]", 5 range=[0, 0.5] 6 ), 7 yaxis=dict( 8 title="a", 9 range=[-2, 2] 10 ), 11 yaxis2=dict( 12 title="b", 13 overlaying="y", 14 side="right", 15 range=[-2, 2] 16 ), 17)

投稿2018/09/12 13:17

yuwki0131

総合スコア160

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

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

murmur1975

2018/09/12 13:55 編集

ありがとうございます。 なるほど。実際に使用したい2つのデータは、平均がほとんど0で大きさがかなり異なっていて、それらの波形の時間関係性を見たいです。デフォルト表示でそろえるのでであれば、それぞれのデータの絶対値の大きい方の値を使ってレンジを揃える、というやり方がよさそうですね。ソースを追記しておきます。
guest

0

yuwki0131さんの助言を受け、こんなふうにしてみました。x軸を常に上下中央に描画します。

python3

1import plotly 2import numpy as np 3 4T= 0.5 5N = 2501 6x_t = np.linspace(0, T, N)#時間軸 7 8#最大値と最小値が異なる波形を生成 9a = 2*np.sin(2*np.pi*10*x_t) + np.random.normal(0, 0.05, N) 10b = np.cos(2*np.pi*10*x_t) + np.random.normal(0, 0.1, N) + 0.1 11 12#レンジを取得 13range_a = abs(a).max() 14range_b = abs(b).max() 15 16trace1 = plotly.graph_objs.Scatter( 17 x=x_t, 18 y=a 19 ) 20trace2 = plotly.graph_objs.Scatter( 21 x=x_t, 22 y=b, 23 yaxis="y2" 24) 25p_data=[trace1, trace2] 26p_layout = plotly.graph_objs.Layout( 27 title="test", 28 xaxis=dict( 29 title="time[s]", 30 range=[0, 0.5] 31 ), 32 yaxis=dict( 33 title="a", 34 range=[-range_a, range_a]#レンジを指定 35 ), 36 yaxis2=dict( 37 title="b", 38 overlaying="y", 39 side="right", 40 range=[-range_b, range_b]#レンジを指定 41 ), 42) 43fig = plotly.graph_objs.Figure(data=p_data, layout=p_layout) 44plotly.offline.plot(fig) 45

これで質問1は解決ですね。ありがとうございます。
2の解決法をご存知の方がいらっしゃるかもしれませんので、質問は閉めないでおきます。引き続きよろしくおねがいします。

投稿2018/09/12 13:51

編集2018/09/12 13:59
murmur1975

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問