2012-04-25 33 views
5

私はプロット上にいくつかのグリッド線を持ちたいと思っていますが、実際には全長の線はあまりにも/散漫で、点線の明るい灰色の線でさえあります。 SVG出力を手作業で編集して、私が探していた効果を得ました。 matplotlibでこれを行うことはできますか?私はグリッド用のpyplot APIを見ていましたが、それに近づくことができる唯一のことは、xdataとydata Line2D kwargsです。プロット上のグリッド線の代わりに、matplotlibはグリッドの十字線を印刷できますか?

enter image description here

答えて

3

グリッド線は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'マーカーは、開始及び軸端部の端部にのみあるか

enter image description here

お知らせ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() 

enter image description here

あなたが見ることができるように、私はXに目盛りを取り、 yを使用してグリッド記号( '+')が必要な一連の点を定義します。私はmeshgridを使って2つの1D配列を取り、2つの2D配列を各格子点の二重ループに対応させます。私は'+'というマークスタイルでこれをプロットしています。これは上に十字をプロットし、プロットに関連する行のリストを並べ替えるために追加のキーワードを追加しました。私はグリッドマークのをすべての背後に描画するように調整します。*****

この例では、デフォルトでグリッドが背面に配置され、右側のサブプロットではこのオプションが無効になります。各プロットで緑色の線をたどると、その違いがわかります。あなたは、グリッドを持っていることによって悩まさボーダーに交差している場合は、グリッドを定義する前に

、あなたはそうのように、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) 

を私は次の例では、この、私のポイントを作るために、より大きな、異なるマーカーを使用して:

enter image description here

*****これを指摘して@fraxelによって答えに感謝します。

+0

、有益で革新的!また、kwargsを使って色とサイズをより詳細に設定することができます。 –

+0

軸にマーカーをプロットするという問題もあります。私はxgridをスライスすることができたら、ygridの配列 –

3

ティックポイントの交点ごとに線分を描くことができます。その簡単な操作は、axhlineaxvlineを使用して短い線分を描き、交差点ごとに十字線を作成して、両方の軸の目盛りの位置get_ticklocs()をすべての組み合わせにループさせてループします。私はzorder=0を設定しているので、十字線が最初に描画され、プロットデータの後ろに表示されます。色/アルファおよび十字線のサイズを簡単に制御できます。いくつかのちょっとした問題は...ティックの位置を取得する前にプロットしてください。xminxmaxのパラメータも正規化が必要なようです。

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() 

enter image description here

+0

素晴らしい!クロスのサイズ/長さを微調整する柔軟性がたくさんあります。正規化ビットについては正しいですが、比を正しく取得するためには、特に正方形以外の図形サイズの場合には作業が必要になります。私は目盛りがある軸に余分な線があることを知っているので、それらを取り除こうとします。 –

+0

@a別のベン - ちょっと、x軸とy軸の十字架について気付かなかった!私はスライスでそれらを取り除くために更新しました。そして、ええ、軸の値ではなくプロットのサイズに依存する最小値と最大値は非常に奇妙です。 – fraxel

関連する問題