ノート
完全なサンプルコードをダウンロードするには、ここをクリックしてください
axisartist ツールキットの概要#
axisartist ツールキットのチュートリアル。
警告
axisartistはカスタム Axes クラス (Matplotlib の元の Axes クラスから派生) を使用します。副作用として、一部のコマンド (主にティック関連) が機能しません。
axisartistには、曲線グリッド (天文学の世界座標系など) をサポートするためのカスタム Axes クラスが含まれています。Axes.xaxis と Axes.yaxis を使用して目盛りや目盛り線などを描画する Matplotlib の元の Axes クラスとは異なり、axisartist は曲線座標系の目盛りや目盛り線などを処理できる特別なアーティスト (AxisArtist) を使用します。

特別なアーティストを使用するため、Axes.xaxis および Axes.yaxis で動作する一部の Matplotlib コマンドが動作しない場合があります。
軸アーティスト#
axisartistモジュールは、カスタム (および非常に実験的な) Axes クラスを提供します。このクラスでは、各軸 (左、右、上、および下) に、軸線、目盛り、目盛りラベル、およびラベルの描画を担当する個別の関連付けられたアーティストがあります。また、軸座標の固定位置、またはデータ座標の固定位置を通過できる独自の軸を作成することもできます (つまり、viewlimit が変更されたときに軸が浮動します)。
軸クラスには、デフォルトで xaxis と yaxis が表示されず、「左」、「右」、「下」、「上」の 4 つの軸スパインの描画を担当する 4 つの追加のアーティストがいます。それらは ax.axis["left"]、ax.axis["right"] などとしてアクセスされます。つまり、ax.axis はアーティストを含む辞書です (ax.axis は依然として呼び出し可能なメソッドであり、 Matplotlib の元の Axes.axis メソッドとして動作します)。
軸を作成するには、
import mpl_toolkits.axisartist as AA
fig = plt.figure()
fig.add_axes([0.1, 0.1, 0.8, 0.8], axes_class=AA.Axes)
またはサブプロットを作成する
fig.add_subplot(111, axes_class=AA.Axes)
# Given that 111 is the default, one can also do
fig.add_subplot(axes_class=AA.Axes)
たとえば、次のコマンドを使用して、右と上のスパインを非表示にできます。
ax.axis["right"].set_visible(False)
ax.axis["top"].set_visible(False)

横軸を追加することも可能です。たとえば、横軸が y=0 (データ座標) にあるとします。
ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0)

または、オフセットのある固定軸
# make new (right-side) yaxis, but with some offset
ax.axis["right2"] = ax.new_fixed_axis(loc="right", offset=(20, 0))
ParasiteAxes を使用する axisartist #
axes_grid1 ツールキットのほとんどのコマンドは、axes_class キーワード引数を受け取ることができ、コマンドは指定されたクラスの Axes を作成します。たとえば、axisartist.Axes でホスト サブプロットを作成するには、
import mpl_toolkits.axisartist as AA
from mpl_toolkits.axes_grid1 import host_subplot
host = host_subplot(111, axes_class=AA.Axes)
ParasiteAxes を使用した例を次に示します。

曲線グリッド#
AxisArtist モジュールの背後にある動機は、曲線グリッドと目盛りをサポートすることです。

フローティング軸#
AxisArtist は、外側の軸が浮動軸として定義されている浮動軸もサポートしています。

axisartist 名前空間#
axisartist名前空間には、派生した Axes 実装が含まれています。最大の違いは、軸線、目盛り、目盛りラベル、および軸ラベルの描画を担当するアーティストが、元の Matplotlib のアーティストよりもはるかに多い、Matplotlib の Axis クラスから分離されていることです。この変更は、曲線グリッドをサポートするために強く動機付けられました。mpl_toolkits.axisartist.Axes が Matplotlib の元の Axes と異なる点がいくつかあります。
軸要素 (軸線 (スパイン)、目盛り、目盛りラベル、および軸ラベル) は、AxisArtist インスタンスによって描画されます。Axis とは異なり、左、右、上、下の軸は別々のアーティストによって描かれます。また、それぞれの目盛りの位置と目盛りラベルが異なる場合があります。
グリッド線は Gridlines インスタンスによって描画されます。この変更は、曲線座標では、グリッド線が軸線と交差しない (つまり、関連付けられた目盛りがない) 可能性があることに動機付けられました。元の Axes クラスでは、グリッド線は目盛りに関連付けられています。
目盛線は必要に応じて回転できます (つまり、グリッド線に沿って)
要約すると、これらの変更はすべてサポートするためのものでした
曲線グリッド。
浮遊軸

mpl_toolkits.axisartist.Axesクラスは、 AxisArtist インスタンスの辞書である軸属性を定義します。デフォルトでは、ディクショナリには 4 つの AxisArtist インスタンスがあり、左、右、下、および上軸の描画を担当します。
xaxis および yaxis 属性は引き続き使用できますが、非表示に設定されています。軸のレンダリングには別のアーティストが使用されるため、Matplotlib の一部の軸関連メソッドは効果がない場合があります。AxisArtist インスタンスに加えて、mpl_toolkits.axisartist.Axes には gridlines属性(Gridlines) があり、明らかにグリッド線を描画します。
AxisArtist と Gridlines の両方で、目盛りとグリッドの位置の計算は GridHelper クラスのインスタンスに委譲されます。mpl_toolkits.axisartist.Axes クラスは、GridHelperRectlinear をグリッド ヘルパーとして使用します。GridHelperRectlinear クラスは、 Matplotlib の元の Axes のxaxis とyaxisのラッパーであり、Matplotlib の元の軸が機能する方法として機能することを意図していました。たとえば、set_ticks メソッドなどを使用した目盛りの位置の変更は、期待どおりに機能するはずです。ただし、頻繁に変更される属性 (色など) が尊重されるように、ある程度の努力はされていますが、アーティストのプロパティ (色など) の変更は一般的には機能しません。
AxisArtist #
AxisArtist は、目盛り、ラベルなどを描画する次の属性を持つコンテナー アーティストと見なすことができます。
ライン
major_ticks, major_ticklabels
minor_ticks、minor_ticklabels
オフセットテキスト
ラベル
行番号
Line2D クラスから派生。背骨(?)の線引きを担当。
major_ticks、minor_ticks #
Line2D クラスから派生。目盛りはマーカーであることに注意してください。
major_ticklabels、minor_ticklabels #
テキストから派生。テキスト アーティストのリストではなく、単一のアーティスト (コレクションに似ています) であることに注意してください。
軸ラベル#
テキストから派生。
デフォルトの AxisArtists #
デフォルトでは、以下の軸アーティストが定義されています。
ax.axis["left"], ax.axis["bottom"], ax.axis["right"], ax.axis["top"]
上軸と右軸の目盛りラベルと軸ラベルは非表示に設定されています。
たとえば、下の x 軸の major_ticklabels の色属性を変更したい場合
ax.axis["bottom"].major_ticklabels.set_color("b")
同様に、目盛りラベルを非表示にするには
ax.axis["bottom"].major_ticklabels.set_visible(False)
AxisArtist は、目盛り、目盛りラベル、およびラベルの可視性を制御するためのヘルパー メソッドを提供します。ticklabel を非表示にするには、
ax.axis["bottom"].toggle(ticklabels=False)
すべての目盛り、目盛りラベル、および (軸) ラベルを非表示にするには
ax.axis["bottom"].toggle(all=False)
すべてをオフにして、ティックをオンにするには
ax.axis["bottom"].toggle(all=False, ticks=True)
(軸) ラベル以外をすべてオンにするには
ax.axis["bottom"].toggle(all=True, label=False)
ax.axis の __getitem__ メソッドは、複数の軸名を取ることができます。たとえば、「上」軸と「右」軸の目盛りラベルをオンにするには、
ax.axis["top", "right"].toggle(ticklabels=True)
上記のコードを以下のようなものに変換する単純なプロキシ オブジェクトを返すことに注意してください。ax.axis["top", "right"]
for n in ["top", "right"]:
ax.axis[n].toggle(ticklabels=True)
そのため、for ループの戻り値は無視されます。また、単純な方法以外には使用しないでください。
リストのインデックスと同様に、「:」はすべてのアイテムを意味します。つまり、
ax.axis[:].major_ticks.set_color("r")
すべての軸の目盛りの色を変更します。
ハウツー#
目盛りの位置とラベルの変更。
元の Matplotlib の軸と同じ:
ax.set_xticks([1, 2, 3])
色などの軸プロパティの変更。
適切なアーティストのプロパティを変更します。たとえば、目盛りラベルの色を変更するには:
ax.axis["left"].major_ticklabels.set_color("r")
複数の軸の属性を変更するには:
ax.axis["left", "bottom"].major_ticklabels.set_color("r")
またはすべての軸の属性を変更するには:
ax.axis[:].major_ticklabels.set_color("r")
目盛りのサイズ (長さ) を変更するには、axis.major_ticks.set_tickssize メソッドを使用する必要があります。目盛りの方向を変更するには (既定では、目盛りは目盛りラベルの反対方向です)、axis.major_ticks.set_tick_out メソッドを使用します。
目盛りと目盛りラベルの間のパッドを変更するには、axis.major_ticklabels.set_pad メソッドを使用します。
目盛りラベルと軸ラベルの間のパッドを変更するには、axis.label.set_pad メソッドを使用します。
TickLabels の回転と整列#
これも標準の Matplotlib とは大きく異なり、混乱を招く可能性があります。目盛りラベルを回転させたい場合は、まず「set_axis_direction」メソッドの使用を検討してください。
ax1.axis["left"].major_ticklabels.set_axis_direction("top")
ax1.axis["right"].label.set_axis_direction("left")

set_axis_direction のパラメーターは、["left"、"right"、"bottom"、"top"] のいずれかです。
方向の基本的な概念を理解する必要があります。
座標が増加する軸線の方向として定義される参照方向があります。たとえば、左の x 軸の参照方向は下から上です。
目盛り、目盛りラベル、および軸ラベルの方向、テキストの角度、および配置は、参照方向に対して決定されます。
label_directionとticklabel_directionは、参照方向の右側 (+) または左側 (-) です。
デフォルトでは、目盛りは目盛りラベルの反対方向に描画されます。
ticklabels と label のテキストの回転は、それぞれticklabel_directionまたはlabel_directionを参照して決定されます。目盛りラベルとラベルの回転は固定されています。

一方、「axis_direction」という概念があります。これは、「下」、「左」、「上」、および「右」の各軸の上記のプロパティのデフォルト設定です。
?
?
左
下
右
上
軸ラベル
方向
「-」
'+'
'+'
「-」
軸ラベル
回転
180
0
0
180
軸ラベル
ヴァ
中心
上
中心
下
軸ラベル
ハ
右
中心
右
中心
目盛りラベル
方向
「-」
'+'
'+'
「-」
目盛りラベル
回転
90
0
-90
180
目盛りラベル
ハ
右
中心
右
中心
目盛りラベル
ヴァ
中心
ベースライン
中心
ベースライン
そして、「set_axis_direction("top")」は、「上」軸に適した設定のために、テキストの回転などを調整することを意味します。軸方向の概念は、曲線軸を使用するとより明確になります。

axis_direction は、AxisArtist レベル、またはその子アーティスト、つまり ticks、ticklabels、および axis-label のレベルで調整できます。
ax1.axis["left"].set_axis_direction("top")
関連するすべてのアーティストの axis_direction を「左」軸に変更します。
ax1.axis["left"].major_ticklabels.set_axis_direction("top")
major_ticklabels のみの axis_direction を変更します。AxisArtist レベルの set_axis_direction は ticklabel_direction と label_direction を変更しますが、目盛り、ticklabels、および軸ラベルの axis_direction を変更してもそれらには影響しないことに注意してください。
外側の目盛りと軸の内側の目盛りラベルを作成する場合は、invert_ticklabel_direction メソッドを使用します。
ax.axis[:].invert_ticklabel_direction()
関連するメソッドは「set_tick_out」です。外側に目盛りを付けます(実際のところ、デフォルトの方向とは反対方向に目盛りを付けます)。
ax.axis[:].major_ticks.set_tick_out(True)

つまり、要約すると、
AxisArtist のメソッド
set_axis_direction: "left"、"right"、"bottom"、または "top"
set_ticklabel_direction: "+" または "-"
set_axislabel_direction: "+" または "-"
invert_ticklabel_direction
ティックのメソッド (major_ticks および minor_ticks)
set_tick_out: True または False
set_tickssize: ポイント単位のサイズ
TickLabels のメソッド (major_ticklabels および minor_ticklabels)
set_axis_direction: "left"、"right"、"bottom"、または "top"
set_rotation: 基準方向に対する角度
set_ha および set_va: 以下を参照
AxisLabels のメソッド (ラベル)
set_axis_direction: "left"、"right"、"bottom"、または "top"
set_rotation: 基準方向に対する角度
set_ha と set_va
目盛ラベルの配置の調整#
TickLabels の配置は特別に扱われます。下記参照

パッド番号の調整
目盛りと目盛りラベルの間でパッドを変更するには
ax.axis["left"].major_ticklabels.set_pad(10)
または ticklabels と axis-label
ax.axis["left"].label.set_pad(10)

グリッドヘルパー#
曲線座標を実際に定義するには、独自のグリッド ヘルパーを使用する必要があります。グリッド ヘルパー クラスの一般化されたバージョンが提供されており、ほとんどの場合、このクラスで十分です。ユーザは、曲線座標から (直線) 画像座標への変換 (およびその逆ペア) を定義する 2 つの関数を提供できます。曲線座標に対して目盛りとグリッドが描画されますが、軸自体 (ax.transData) のデータ変換はまだ直線 (画像) 座標であることに注意してください。
from mpl_toolkits.axisartist.grid_helper_curvelinear \
import GridHelperCurveLinear
from mpl_toolkits.axisartist import Axes
# from curved coordinate to rectlinear coordinate.
def tr(x, y):
x, y = np.asarray(x), np.asarray(y)
return x, y-x
# from rectlinear coordinate to curved coordinate.
def inv_tr(x, y):
x, y = np.asarray(x), np.asarray(y)
return x, y+x
grid_helper = GridHelperCurveLinear((tr, inv_tr))
fig.add_subplot(axes_class=Axes, grid_helper=grid_helper)
代わりに Matplotlib の Transform インスタンスを使用できます (ただし、逆変換を定義する必要があります)。多くの場合、曲線座標系の座標範囲は範囲が制限されている場合や、循環している場合があります。そのような場合、よりカスタマイズされたバージョンのグリッド ヘルパーが必要です。
import mpl_toolkits.axisartist.angle_helper as angle_helper
# PolarAxes.PolarTransform takes radian. However, we want our coordinate
# system in degree
tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()
# extreme finder: find a range of coordinate.
# 20, 20: number of sampling points along x, y direction
# The first coordinate (longitude, but theta in polar)
# has a cycle of 360 degree.
# The second coordinate (latitude, but radius in polar) has a minimum of 0
extreme_finder = angle_helper.ExtremeFinderCycle(20, 20,
lon_cycle = 360,
lat_cycle = None,
lon_minmax = None,
lat_minmax = (0, np.inf),
)
# Find a grid values appropriate for the coordinate (degree,
# minute, second). The argument is a approximate number of grids.
grid_locator1 = angle_helper.LocatorDMS(12)
# And also uses an appropriate formatter. Note that the acceptable Locator
# and Formatter classes are different than that of Matplotlib's, and you
# cannot directly use Matplotlib's Locator and Formatter here (but may be
# possible in the future).
tick_formatter1 = angle_helper.FormatterDMS()
grid_helper = GridHelperCurveLinear(tr,
extreme_finder=extreme_finder,
grid_locator1=grid_locator1,
tick_formatter1=tick_formatter1
)
ここでも、軸のtransDataは依然として直線座標 (画像座標) です。2 つの座標間の変換を手動で行うことも、便宜上 Parasite Axes を使用することもできます。
ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper)
# A parasite axes with given transform
ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal")
# note that ax2.transData == tr + ax1.transData
# Anything you draw in ax2 will match the ticks and grids of ax1.
ax1.parasites.append(ax2)

FloatingAxis #
浮動軸は、データ座標が固定されている軸の 1 つです。つまり、その位置は Axes 座標で固定されていませんが、軸のデータ制限が変更されると変更されます。浮動軸は、 new_floating_axisメソッドを使用して作成できます。ただし、結果の AxisArtist が適切に軸に追加されることは、ユーザーの責任です。推奨される方法は、Axes の axis 属性の項目として追加することです。
# floating axis whose first (index starts from 0) coordinate
# (theta) is fixed at 60
ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60)
axis.label.set_text(r"$\theta = 60^{\circ}$")
axis.label.set_visible(True)
このページの最初の例を参照してください。
現在の制限事項と TODO の#
コードをさらに改良する必要があります。問題と TODO の不完全なリストは次のとおりです。
ユーザーがカスタマイズした目盛りの位置をサポートする簡単な方法はありません (曲線グリッドの場合)。新しい Locator クラスを作成する必要があります。
FloatingAxis には、x = 0 の浮動軸など、座標制限がある場合がありますが、y は 0 から 1 までの範囲しかありません。
FloatingAxis の axislabel の位置は、オプションで座標値として指定する必要があります。ex、y=1 にラベルが付いた x=0 の浮動軸