プロットにいくつかのグリッド線を配置したいのですが、実際には、全長の線は多すぎて気が散り、薄い灰色の破線でさえあります。探していた効果を得るために、SVG出力を手動で編集しました。これはmatplotlibで実行できますか?グリッドのpyplotapiを確認しましたが、それに近づくことができる可能性があるのは、xdataとydataLine2Dkwargsだけです。
2 に答える
目盛りのすべての交点で線分を描画できます。非常に簡単に実行できます。両方の軸の目盛りの位置を取得し、すべての組み合わせをループして、とget_ticklocs()
を使用して短い線分を描画し、すべての交差点に十字線を作成します。十字線が最初に描画されるように設定しました。これにより、十字線がプロットデータの背後に表示されます。カラー/アルファと十字線のサイズを簡単に制御できます。いくつかのわずかな「落とし穴」...ティックの位置を取得する前にプロットを実行します。また、パラメータは正規化が必要なようです。axhline
axvline
zorder=0
xmin
xmax
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot((0,2,3,5,5,5,6,7,8,6,6,4,3,32,7,99), 'r-',linewidth=4)
x_ticks = ax.xaxis.get_ticklocs()
y_ticks = ax.yaxis.get_ticklocs()
for yy in y_ticks[1:-1]:
for xx in x_ticks[1:-1]:
plt.axhline(y=yy, xmin=xx / max(x_ticks) - 0.02,
xmax=xx / max(x_ticks) + 0.02, color='gray', alpha=0.5, zorder=0)
plt.axvline(x=xx, ymin=yy / max(y_ticks) - 0.02,
ymax=yy / max(y_ticks) + 0.02, color='gray', alpha=0.5, zorder=0)
plt.show()
グリッド線は2点のみを使用して作成されるため、これは基本APIでは実行できません。グリッド線には、マーカーを描画するために、すべての目盛りに「データ」ポイントが必要です。これを次の例に示します。
import matplotlib.pyplot as plt
ax = plt.subplot(111)
ax.grid(clip_on=False, marker='o', markersize=10)
plt.savefig('crosses.png')
plt.show()
これにより、次のようになります。
'o'
グリッド線には2つのポイントしか含まれていないため、マーカーが軸のエッジの最初と最後にのみあることに注意してください。
一連のを使用してクロスマークを作成し、必要なものをエミュレートするメソッドを作成することもできますがArtists
、基本的なプロット機能を利用してクロスパターンを描画する方が簡単です。
これは、次の例で私が行うことです。
import matplotlib.pyplot as plt
import numpy as np
NPOINTS=100
def set_grid_cross(ax, in_back=True):
xticks = ax.get_xticks()
yticks = ax.get_yticks()
xgrid, ygrid = np.meshgrid(xticks, yticks)
kywds = dict()
if in_back:
kywds['zorder'] = 0
grid_lines = ax.plot(xgrid, ygrid, 'k+', **kywds)
xvals = np.arange(NPOINTS)
yvals = np.random.random(NPOINTS) * NPOINTS
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
ax1.plot(xvals, yvals, linewidth=4)
ax1.plot(xvals, xvals, linewidth=7)
set_grid_cross(ax1)
ax2.plot(xvals, yvals, linewidth=4)
ax2.plot(xvals, xvals, linewidth=7)
set_grid_cross(ax2, in_back=False)
plt.savefig('gridpoints.png')
plt.show()
これにより、次の図が得られます。
ご覧のとおり、xとyの目盛りを使用して、グリッドマーク(「+」)が必要な一連のポイントを定義します。私はmeshgrid
2つの1D配列を取得し、各グリッドポイントの二重ループに対応する2つの2D配列を作成するために使用します。これをマークスタイルでプロットすると、'+'
ほぼ完了です。これにより、十字が上にプロットされ、プロットに関連付けられた線のリストを並べ替えるためのキーワードが追加されました。zorder
グリッドマークをすべての後ろに描画する場合は、グリッドマークを調整します。*****
この例は、デフォルトでグリッドが後ろに配置されている左側のサブプロットを示しており、右側のサブプロットはこのオプションを無効にしています。各プロットの緑色の線をたどると、違いに気付くことができます。
set_grid_cross
ボーダーにグリッドの交差があることに悩まされている場合は、次のように、でグリッドを定義する前に、xとyの両方の最初と最後の目盛りを削除できます。
xticks = ax.get_xticks()[1:-1] #< notice the slicing
yticks = ax.get_yticks()[1:-1] #< notice the slicing
xgrid, ygrid = np.meshgrid(xticks, yticks)
次の例では、これをより大きく異なるマーカーを使用して行います。
*****これを指摘してくれた@fraxelの回答に感謝します。