ハウツー#
ティックが非常に多いのはなぜですか。#
予期しないティック動作の一般的な原因の 1 つは、数値または日時オブジェクトの代わりに文字列のリストを渡すことです。これは、カンマ区切りのテキスト ファイルを読み取るときに、予告なしに簡単に発生する可能性があります。Matplotlib は、文字列のリストをカテゴリ変数として扱い (カテゴリ変数のプロット)、デフォルトでカテゴリごとに 1 つの目盛りを配置し、それらが提供された順序でプロットします。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))
ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9'] # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)
ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)] # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)
解決策は、文字列のリストを数値または日時オブジェクト (多くの場合または
) に変換することです。np.asarray(numeric_strings, dtype='float')
np.asarray(datetime_strings, dtype='datetime64[s]')
詳細については、ティックが多すぎるのを修正する を参照してください。
図のアーティストの範囲を決定する#
アーティストの範囲を知りたい場合があります。MatplotlibArtist
オブジェクトには、Artist.get_window_extent
通常、アーティストの範囲をピクセル単位で返すメソッドがあります。ただし、一部のアーティスト、特にテキストは、その範囲を知る前に少なくとも 1 回レンダリングする必要があります。Matplotlib は
Figure.draw_without_rendering
、 を呼び出す前に呼び出す必要がある を
提供しget_window_extent
ます。
Figure が空かどうかを確認する#
空は、実際には異なることを意味する場合があります。フィギュアにはアーティストが含まれていますか? 空のままの図は空Axes
としてカウントされますか? 純粋な白でレンダリングされた場合、図は空ですか (アーティストが存在する可能性がありますが、描画領域外または透明である可能性があります)。
ここでの目的のために、空を次のように定義します。「フィギュアには背景パッチ以外のアーティストは含まれていません」背景の例外が必要です。デフォルトでは、すべての図にRectangle
背景パッチが含まれているためです。この定義は、次の方法で確認できます。
def is_empty(figure):
"""
Return whether the figure contains no Artists (other than the default
background patch).
"""
contained_artists = figure.get_children()
return len(contained_artists) <= 1
これは空を定義する 1 つの方法にすぎず、上記のチェックが必要になることはめったにないため、これを Figure メソッドとして含めないことにしました。通常、Figure を処理するユーザーまたはプログラムは、Figure に何かを追加したかどうかを認識しています。
Figure が空にレンダリングされるかどうかの確認は、実際に Figure をレンダリングしてレンダリング結果を調べる以外に確実に確認することはできません。
特定のタイプの図ですべてのオブジェクトを見つける#
すべての Matplotlib アーティスト (アーティスト チュートリアルを参照) には、何らかの基準 (たとえば、すべての
インスタンスに一致する、または任意のフィルター関数に一致するなど)findobj()
を満たすアーティストが含まれる可能性があるアーティストを再帰的に検索するために使用できるメソッドが呼び出されます。Line2D
たとえば、次のスニペットは、
set_color
プロパティを持つ Figure 内のすべてのオブジェクトを検出し、オブジェクトを青にします。
def myfunc(x):
return hasattr(x, 'set_color')
for o in fig.findobj(myfunc):
o.set_color('blue')
クラス インスタンスでフィルタリングすることもできます。
import matplotlib.text as text
for o in fig.findobj(text.Text):
o.set_fontstyle('italic')
目盛りラベルがオフセットを持つのを防ぐ#
デフォルトのフォーマッタは、オフセットを使用して目盛りラベルの長さを減らします。この機能を軸ごとにオフにするには:
ax.get_xaxis().get_major_formatter().set_useOffset(False)
設定rcParams["axes.formatter.useoffset"]
(デフォルト: True
) するか、別のフォーマッタを使用します。詳細ticker
については、を参照してください。
透明な数字を保存する#
savefig()
コマンドにはキーワード引数
transparentがあり、'True' の場合、保存時に Figure と Axes の背景が透明になりますが、画面に表示されるイメージには影響しません。
より細かい制御が必要な場合、たとえば、完全な透明度が必要ない場合や、画面に表示されるバージョンにも影響を与えたい場合は、アルファ プロパティを直接設定できます。Figure には
patchRectangle
というインスタンス
があり、Axes にはpatchという Rectangle インスタンスがあります。それらの任意のプロパティを直接設定できます ( facecolor、edgecolor、linewidth、
linestyle、alpha )。例えば:
fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)
すべての図要素を透明にする必要がある場合、現在グローバル アルファ設定はありませんが、個々の要素にアルファ チャネルを設定できます。
ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)
複数のプロットを 1 つの pdf ファイルに保存する#
多くの画像ファイル形式は、ファイルごとに 1 つの画像しか持てませんが、一部の形式は複数ページのファイルをサポートしています。backend_pdf.PdfPages
現在、Matplotlib はおよびbackend_pgf.PdfPages
クラスを介して、pdf または pgf バックエンドのいずれかを使用して、複数ページの出力を pdf ファイルにのみ提供します
。
目盛りラベルのためのスペースを作る#
デフォルトでは、Matplotlib はサブプロットの周囲に固定パーセント マージンを使用します。これにより、ラベルが重なったり、図の境界で途切れたりする可能性があります。これを修正するには、複数の方法があります。
Figure.subplots_adjust
/ を使用して、サブプロット パラメーターを手動で調整しますpyplot.subplots_adjust
。自動レイアウト メカニズムのいずれかを使用します。
制約付きレイアウト (制約付きレイアウト ガイド)
タイト レイアウト (タイト レイアウト ガイド)
プロット要素のサイズから適切な値を自分で計算します (サブプロット調整をプログラムで制御します) 。
複数のサブプロット間で私の ylabels を揃える#
互いに複数のサブプロットがあり、y データのスケールが異なる場合、多くの場合、複数のサブプロット間で垂直方向に整列しない ylabel を取得できますが、これは魅力的ではありません。デフォルトでは、Matplotlib は y 目盛りのいずれとも重ならないように ylabel の x 位置を配置します。ラベルの座標を指定することで、このデフォルトの動作をオーバーライドできます。以下の例は、左側のサブプロットでデフォルトの動作を示し、右側のサブプロットで手動設定を示しています。
プロット要素の描画順序を制御する#
プロット要素の描画順序、つまりどの要素が一番上になるかは、set_zorder
プロパティによって決まります。詳細な説明については、Zorder Demoを参照してください。
プロットの縦横比を等しくする#
Axes プロパティset_aspect()
は、軸の縦横比を制御します。「auto」、「equal」、または比率を制御する比率に設定できます。
ax = fig.add_subplot(111, aspect='equal')
完全な例については、等軸縦横比を参照してください。
複数の y 軸スケールを描画する#
頻繁に要求されるのは、左右の y 軸に 2 つのスケールを使用するtwinx()
ことです (ウィッシュ リストにはありますが、2 つ以上のスケールは現在サポートされていません)。これはかなりうまく機能しますが、インタラクティブにパンとズームをしようとすると、両方のスケールが信号を取得しないため、いくつかの癖があります。
このアプローチでは、twinx()
(およびその姉妹
twiny()
)を使用して2つの異なる軸を使用し、2番目の軸で軸の長方形フレームをオフにして、最初の軸を覆い隠しないようにし、目盛りの位置とラベルを必要に応じて手動で設定します。2 つの軸が独立しているため、必要に応じて個別のmatplotlib.ticker
フォーマッターとロケーターを使用できます。
完全な例については、異なるスケールのプロットを参照してください。
ウィンドウを表示せずに画像を生成する#
を呼び出さずshow
に、Figure を目的の形式で直接保存します。
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')
こちらもご覧ください
Web アプリケーション内での matplotlib の実行に関する情報については、Web アプリケーション サーバー (Flask) に埋め込みます。
スレッドを操作する#
Matplotlib はスレッドセーフではありません。実際、特定のアーティストに影響を与える既知の競合状態があります。したがって、スレッドを操作する場合は、適切なロックを設定して Matplotlib アーティストへのアクセスをシリアル化する必要があります。
別のスレッドから別の図を操作できる場合があります。ただし、ほとんどの GUI バックエンドはメイン スレッドからも実行する必要があるため、その場合は非対話型バックエンド(通常は Agg) を使用する必要があります。