是否可以將matplotlib路徑的線寬與數字縮放/比例級別綁定?matplotlib路徑線寬連接到圖zoom
我畫一個地圖,其中matplotlib路徑(與貝塞爾曲線)在地圖上繪製的道路。當在我變焦想路徑的寬度進行放大。
在附加的腳本,多邊形逼近可適當放大,但路徑(紅線)不能放大(寬)。
是否可以將線寬與某個比例轉換相結合並通過回調重繪?
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
import numpy as np
def main():
ax = plt.subplot(111)
verts = np.array([ (0., 0.), (0.5, .5), (1., 0.8), (0.8, 0.)])
codes = np.array([Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.LINETO ])
# Can this curve have zoomable width
path = Path(verts, codes)
patch = patches.PathPatch(path, fc='none', color='r', lw=4, zorder=3)
ax.add_patch(patch)
ax.plot(verts[:,0], verts[:,1], 'o--', lw=2, color='k', zorder=2)
# these will be polygonal approx that will have proper zoom
v=np.array([]).reshape((-1,2))
c=[]
for i in range(len(verts)-1):
vtmp, ctmp = line2poly(verts[[i,i+1],:],0.03)
v = np.vstack((v,vtmp))
c = np.concatenate((c,ctmp))
path_zoom = Path(v,c)
patch_zoom = patches.PathPatch(path_zoom, fc='r', ec='k', zorder=1, alpha=0.4)
ax.add_patch(patch_zoom)
ax.set_xlim(-0.1, 1.1)
ax.set_ylim(-0.1, 1.1)
plt.show()
def line2poly(line, width):
dx,dy = np.hstack(np.diff(line,axis=0)).tolist()
theta = np.arctan2(dy,dx)
print(np.hstack(np.diff(line,axis=0)).tolist())
print(np.degrees(theta))
s = width/2 * np.sin(theta)
c = width/2 * np.cos(theta)
trans = np.array([(-s,c),(s,-c),(s,-c),(-s,c)])
verts = line[[0,0,1,1],:]+trans
verts = np.vstack((verts, verts[0,:]))
codes = np.array([Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY])
return verts,codes
if __name__=='__main__':
main()
' plt.quiver'這樣做,但我不知道如何利用這些信息:P – askewchan 2013-03-27 23:18:37
嗯.... plt.quiver不會爲我做這個。 – waqy 2013-03-28 00:50:39
@askewchan - '顫抖'是因爲它使用多邊形而不是路徑(即箭頭沒有中斷,而是多邊形)。 – 2013-03-28 02:18:17