[解決済み] Matplotlibで不連続な軸を作る方法はありますか?
2023-06-12 16:26:40
質問
pyplotを使って不連続なX軸を持つプロットを作成しようとしています。 通常の描画方法は、軸がこのようなものになります。
(値)----//----(後の値)
ここで、//は(values)と(later values)の間のすべてをスキップすることを示しています。
このような例を見つけることができなかったので、それが可能かどうか疑問に思っています。 金融データなどの不連続性を越えてデータを結合できることは知っていますが、軸のジャンプをより明確にしたいのです。 今のところサブプロットを使用していますが、最終的にはすべて同じグラフになるようにしたいです。
どのように解決するのですか?
Paulの回答は、全く問題ない方法です。
しかし、カスタム変換を作りたくない場合は、2つのサブプロットを使用するだけで同じ効果を得ることができます。
ゼロから例を組み立てるよりも、むしろ Paul Ivanov によって書かれた優れた例があります。 があります (これは数ヶ月前にコミットされたばかりなので、現在の git tip にしかありません。ウェブページにはまだありません)。
これはこの例を単純に改造して、y軸の代わりに不連続なx軸を持つようにしただけのものです。(それが、この投稿を CW にしている理由です)。
基本的には、このようなことをするだけです。
import matplotlib.pylab as plt
import numpy as np
# If you're not familiar with np.r_, don't worry too much about this. It's just
# a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.
x = np.r_[0:1:0.1, 9:10:0.1]
y = np.sin(x)
fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)
# plot the same data on both axes
ax.plot(x, y, 'bo')
ax2.plot(x, y, 'bo')
# zoom-in / limit the view to different portions of the data
ax.set_xlim(0,1) # most of the data
ax2.set_xlim(9,10) # outliers only
# hide the spines between ax and ax2
ax.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax.yaxis.tick_left()
ax.tick_params(labeltop='off') # don't put tick labels at the top
ax2.yaxis.tick_right()
# Make the spacing between the two axes a bit smaller
plt.subplots_adjust(wspace=0.15)
plt.show()
<イグ
折れた軸線を追加するには
//
の効果を追加するには、次のようにします (再び、Paul Ivanov の例から変更しました)。
import matplotlib.pylab as plt
import numpy as np
# If you're not familiar with np.r_, don't worry too much about this. It's just
# a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.
x = np.r_[0:1:0.1, 9:10:0.1]
y = np.sin(x)
fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)
# plot the same data on both axes
ax.plot(x, y, 'bo')
ax2.plot(x, y, 'bo')
# zoom-in / limit the view to different portions of the data
ax.set_xlim(0,1) # most of the data
ax2.set_xlim(9,10) # outliers only
# hide the spines between ax and ax2
ax.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax.yaxis.tick_left()
ax.tick_params(labeltop='off') # don't put tick labels at the top
ax2.yaxis.tick_right()
# Make the spacing between the two axes a bit smaller
plt.subplots_adjust(wspace=0.15)
# This looks pretty good, and was fairly painless, but you can get that
# cut-out diagonal lines look with just a bit more work. The important
# thing to know here is that in axes coordinates, which are always
# between 0-1, spine endpoints are at these locations (0,0), (0,1),
# (1,0), and (1,1). Thus, we just need to put the diagonals in the
# appropriate corners of each of our axes, and so long as we use the
# right transform and disable clipping.
d = .015 # how big to make the diagonal lines in axes coordinates
# arguments to pass plot, just so we don't keep repeating them
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((1-d,1+d),(-d,+d), **kwargs) # top-left diagonal
ax.plot((1-d,1+d),(1-d,1+d), **kwargs) # bottom-left diagonal
kwargs.update(transform=ax2.transAxes) # switch to the bottom axes
ax2.plot((-d,d),(-d,+d), **kwargs) # top-right diagonal
ax2.plot((-d,d),(1-d,1+d), **kwargs) # bottom-right diagonal
# What's cool about this is that now if we vary the distance between
# ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(),
# the diagonal lines will move accordingly, and stay right at the tips
# of the spines they are 'breaking'
plt.show()
<イグ
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] Matplotlib で凡例をプロットの外側に配置する方法
-
[解決済み] IPythonノートブックmatplotlibプロットをインラインで行う方法
-
[解決済み] matplotlib のプロットで軸のテキストを非表示にする
-
[解決済み] MatplotlibでPyPlotに凡例を追加する最も簡単な方法
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] if 節の終了方法
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。