python – 图中的图中的图
发布时间:2020-12-20 13:51:52 所属栏目:Python 来源:网络整理
导读:我正在尝试使用matplotlib来绘制数字中的数字.由于正方形是最直接的绘制,我从那些开始.最后,我想为具有一定宽度的多边形编写一个生成器.在给定的示例中,这将是具有直角和宽度1的4角多边形. 我当前的代码绘制了以下内容,这是预期的,几乎是所希望的. 请注意,在
我正在尝试使用matplotlib来绘制数字中的数字.由于正方形是最直接的绘制,我从那些开始.最后,我想为具有一定宽度的多边形编写一个生成器.在给定的示例中,这将是具有直角和宽度1的4角多边形.
我当前的代码绘制了以下内容,这是预期的,几乎是所希望的. 请注意,在2,2和2,3之间有一条线,如果用正确的算法代替当前代码,我认为可以删除. 上面的摘要是一个方框,装在两个方框中,振幅增加1,假设较大的方框位于其余方框的“后面”. 我编写产生上述代码的方法实际上并不是一个函数.这是一个非常丑陋的点集合,恰好类似于空心方块. import matplotlib.path as mpath import matplotlib.patches as mpatches import matplotlib.pyplot as plt fig,ax = plt.subplots() INNER_AMPLITUDE = 1.0 OUTER_AMPLITUDE = 3.0 Path_in = mpath.Path path_in_data = [ (Path_in.MOVETO,(INNER_AMPLITUDE,-INNER_AMPLITUDE)),(Path_in.LINETO,(-INNER_AMPLITUDE,INNER_AMPLITUDE)),(Path_in.CLOSEPOLY,] codes,verts = zip(*path_in_data) path_in = mpath.Path(verts,codes) patch_in = mpatches.PathPatch(path_in,facecolor='g',alpha=0.3) ax.add_patch(patch_in) x,y = zip(*path_in.vertices) line,= ax.plot(x,y,'go-') Path_out = mpath.Path path_out_data = [ (Path_out.MOVETO,(OUTER_AMPLITUDE,-OUTER_AMPLITUDE)),(Path_out.LINETO,(-OUTER_AMPLITUDE,OUTER_AMPLITUDE)),OUTER_AMPLITUDE-INNER_AMPLITUDE)),(-(OUTER_AMPLITUDE-INNER_AMPLITUDE),-(OUTER_AMPLITUDE-INNER_AMPLITUDE))),(OUTER_AMPLITUDE-INNER_AMPLITUDE,(Path_out.CLOSEPOLY,verts = zip(*path_out_data) path_out = mpath.Path(verts,codes) patch_out = mpatches.PathPatch(path_out,facecolor='r',alpha=0.3) ax.add_patch(patch_out) plt.title('Square in a square in a square') ax.grid() ax.axis('equal') plt.show() 请注意我认为这是代码审查的偏离主题,因为我正在寻求扩展我的功能,而不仅仅是重写最佳实践.我觉得我完全是错误的做法.首先要做的事情. 我应该如何使用matplotlib绘制具有一定宽度的多边形,假设多边形将在外部被包围,带有相同形状且至少相同宽度并完全填充在内部? 解决方法
纯粹在matplotlib中处理多边形可能非常繁琐.幸运的是,有一个非常好的库可用于这些操作:
shapely.
为了您的目的,parallel_offset函数是要走的路. 您感兴趣的多边形的边界由ring1,ring2和ring3定义: import numpy as np import matplotlib.pyplot as plt import shapely.geometry as sg from descartes.patch import PolygonPatch # if I understood correctly you mainly need the difference d here INNER_AMPLITUDE = 0.1 OUTER_AMPLITUDE = 0.2 d = OUTER_AMPLITUDE - INNER_AMPLITUDE # fix seed,for reproducability np.random.seed(22222) # a function to produce a "random" polygon def random_polygon(): nr_p = np.random.randint(7,15) angle = np.sort(np.random.rand(nr_p)*2*np.pi) dist = 0.3*np.random.rand(nr_p) + 0.5 return np.vstack((np.cos(angle)*dist,np.sin(angle)*dist)).T # your input polygon p = random_polygon() # create a shapely ring object ring1 = sg.LinearRing(p) ring2 = ring1.parallel_offset(d,'right',join_style=2,mitre_limit=10.) ring3 = ring1.parallel_offset(2*d,mitre_limit=10.) # revert the third ring. This is necessary to use it to procude a hole ring3.coords = list(ring3.coords)[::-1] # inner and outer polygon inner_poly = sg.Polygon(ring1) outer_poly = sg.Polygon(ring2,[ring3]) # create the figure fig,ax = plt.subplots(1) # convert them to matplotlib patches and add them to the axes ax.add_patch(PolygonPatch(inner_poly,facecolor=(0,1,0.4),edgecolor=(0,1),linewidth=3)) ax.add_patch(PolygonPatch(outer_poly,facecolor=(1,edgecolor=(1,linewidth=3)) # cosmetics ax.set_aspect(1) plt.axis([-1.5,1.5,-1.5,1.5]) plt.grid() plt.show() 结果: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |