twinx / twinyが期待どおりに機能していません。 これがTODOリストに含まれていることは知っていますが、まだ未解決の問題はありません。
最後のデータセットのみがプロットされているようです。 これが公式の例です。
mpld3は以下を返します:
tk-aggは以下を返します:
再現するコード
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import mpld3
mpld3.enable_notebook()
fig, ax1 = plt.subplots()
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
tl.set_color('b')
ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
tl.set_color('r')
plt.show()
PSの機能の最後の箇条書き「ブラッシングやボックスズームなどの追加のインタラクティブツール」は、ボックスズームとブラッシングの両方が実装されているため、おそらく削除できます。
ありがとう-これはかなり長い間未解決の問題になると思います...それを修正するには、パッケージにいくつかの非常に基本的な変更が必要になります。
好奇心から:d3.js、mplexporter、またはmpld3の問題ですか?
おそらく警告を追加できますか? (Twinx xはまだ実装されていません)
うーん、またはもっと良いことに、右側のフレームの目盛りが拾われるので、おそらく最初の(左の軸)にスケーリングされた青い線を描くことによってこれを偽造することができます。 明日やってみます...
警告は良い考えです。 mplexporter/exporter.py
発生するはずです。 Axesオブジェクトでこれを最適に検出する方法がわかりません。 おそらく、これを実装する方法を理解するための最初のステップは、警告が存在する場合に警告を発する方法を理解することです。
twinx()
とtwiny()
を使用すると、元の軸と同じ位置にある追加の軸が作成されます。 2つの軸が双子であるかどうかを検出することはそれほど難しくありません。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
tl.set_color('b')
ax3 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax3.plot(t, s2, 'r.')
ax3.set_ylabel('sin', color='r')
for tl in ax3.get_yticklabels():
tl.set_color('r')
print ax1.get_shared_x_axes().joined(ax1, ax2)
print ax1.get_shared_x_axes().joined(ax1, ax3)
print ax2.get_shared_x_axes().joined(ax2, ax1)
print ax2.get_shared_x_axes().joined(ax2, ax3)
print ax3.get_shared_x_axes().joined(ax3, ax1)
print ax3.get_shared_x_axes().joined(ax3, ax2)
plt.show()
2つの軸が単純に積み重ねられていることを考えると、すべてがD3に渡され、2つの軸が互いに重なり合うだけであると想定しました。 私はこれを単純なプラグインでチェックしましたが、これは確かに事実です。 指数Line2DとsinLine2Dの両方がD3側に存在します。 実際、D3側の図には2つの軸があります。 これは、ティックが正しくレンダリングされる理由も説明しています。 それらの上に描かれた2番目の軸からは何もありません。
OK、両方の軸が描画されますが、一方が他方の上にあります。 背景が不透明な白いため、下軸の内容は非表示になっています。 また、マウスイベントは軸要素を介して伝播しないため、上軸のみがズームに応答します。
これを修正するには、mpld3レイアウトを再加工する必要があります。 matplotlib自体がこれをどのように処理するのだろうか?
その通り。
axis._frameonは、背景パッチとパッチ周辺のフレームの両方の描画を制御するために使用されているようです。 Frameonは、最初の軸ではtrue、2番目の軸ではfalseです。 ここでframeonをTrueに設定すると、最初の軸に属する線は表示されなくなります。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
tl.set_color('b')
ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
sin = ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
tl.set_color('r')
print ax1.get_frame_on()
print ax2.get_frame_on()
ax2.set_frame_on(True)
plt.show()
これは、この問題が#186に関連しており、一方に対処することでもう一方にも対処できることを示しています。
ああ-それは素晴らしい! それを掘り下げてくれてありがとう。
この問題にどのように対処しますか? 最も明白な解決策は、frame_onを渡し、mpld3_Axesのdrawメソッドを変更して、frame_onがTrueかFalseかを考慮に入れることです。
コードを参照すると、Python側でmplexporterとMPD3Rendererが変更され、javascript側でmpld3Axesが変更されます。
はい:mplexporterはframe_on
を通過するように更新する必要があり、Falseの場合、関連する線と塗りつぶしの色は透明である必要があります。
2番目の軸の背景にアルファを設定することで問題を回避しました。
ax2.patch.set_alpha(0.0)
ax2.patch.set_alpha(0.0)
線を表示できますが、ホバー、パン、ズームツールは下軸では機能しません。 ツールをすべての軸で動作させる方法はありますか?
私が多くの間違いをしない限り、これはまだ問題です。 ax2.patch.set_alpha(0.0)
を使用すると、両方のツインプロットを表示できますが、ズーム/パンは引き続き上軸に対してのみ機能します。 両方のグラフィックが変更されますが、x軸とセカンダリy軸のみが新しいスケーリングに応答します。
私が見つけたもう1つの問題は、3つのx軸を使用しようとした場合です。 3つ目は、この例で説明されているように右側にあるはずですが、想定どおりに機能していません。 3番目のものは2番目のものをオーバーライドします。 ズームツールがまだtwinx()メソッドで機能していません。 すぐに修正できることを願っています(時間があれば、修正しようと思います)。
@fronchettiこのプロジェクトはもはや維持されておらず、数年間維持されていません。 READMEから:
注:mpld3はアクティブにメンテナンスされなくなりました。機能のリクエストとバグレポートは回答されない可能性があります。 このプロジェクトの保守に関心がある場合は、リポジトリの所有者の1人に連絡してください。
Pythonには他にもたくさんのウェブ/ノートブックのプロットオプションがあります:ほんの数例を挙げると、altair、bokeh、bqplotです。 [開示:私はBokehコア開発者です]または、このプロジェクトの所有権を取得することに興味がある場合は、Jakeにメールを送信することをお勧めします。
痛い! 私は彼らのウェブサイトでこの情報を見ませんでした。 私は自分の問題を解決できる問題を探してここに来ました。 @bryevdvに感謝します、私は別のプロットオプションを試してみます。
最も参考になるコメント
2番目の軸の背景にアルファを設定することで問題を回避しました。