Python 人形中的人形中的人形

Python 人形中的人形中的人形,python,python-2.7,matplotlib,Python,Python 2.7,Matplotlib,我正在尝试使用matplotlib以图形中的图形绘制图形。因为正方形是最直接的画法,所以我从正方形开始。最后,我想为具有一定宽度的多边形编写一个生成器。在给定的示例中,这将是一个4角多边形,具有直角和宽度1 我当前的代码绘制了以下内容,这与预期的一样,几乎与预期的一样 注意2,2和2,3之间有一条线,如果使用正确的算法而不是当前代码,我认为可以删除这条线 上面的总结是一个方形框,分为两个框,振幅随着1的增加而增加,假设较大的框在其余框的后面 我编写生成上述代码的方法实际上不是一个函数。这是一个

我正在尝试使用
matplotlib
以图形中的图形绘制图形。因为正方形是最直接的画法,所以我从正方形开始。最后,我想为具有一定宽度的多边形编写一个生成器。在给定的示例中,这将是一个4角多边形,具有直角和宽度1

我当前的代码绘制了以下内容,这与预期的一样,几乎与预期的一样

注意
2,2
2,3
之间有一条线,如果使用正确的算法而不是当前代码,我认为可以删除这条线

上面的总结是一个方形框,分为两个框,振幅随着
1
的增加而增加,假设较大的框在其余框的后面

我编写生成上述代码的方法实际上不是一个函数。这是一个非常丑陋的点集合,恰好类似于空心正方形

将matplotlib.path导入为mpath
将matplotlib.patches作为MPatch导入
将matplotlib.pyplot作为plt导入
图,ax=plt.子批次()
内部振幅=1.0
外部振幅=3.0
路径_in=mpath.Path
路径\u在\u数据中=[
(路径_in.MOVETO,(内部_振幅,-内部_振幅)),
(线路中的路径,(-内部振幅,-内部振幅)),
(线路中的路径,(-内部振幅,内部振幅)),
(路径_in.LINETO,(内部_振幅,内部_振幅)),
(路径μin.CLOSEPOLY,(内振幅,-内振幅)),
]
代码,垂直=zip(*路径在数据中)
路径_in=mpath.path(顶点、代码)
patch_in=mpatches.PathPatch(路径_in,facecolor='g',alpha=0.3)
ax.添加修补程序(修补程序插入)
x、 y=zip(*顶点中的路径)
直线,=ax.plot(x,y,'go-')
路径_out=mpath.Path
路径输出数据=[
(路径out.MOVETO,(外部振幅,-外部振幅)),
(Path_out.LINETO,(-OUTER_振幅,-OUTER_振幅)),
(Path_out.LINETO,(-OUTER_振幅,OUTER_振幅)),
(Path_out.LINETO,(外部振幅,外部振幅)),
(Path_out.LINETO,(外部_振幅,外部_振幅-内部_振幅)),
(路径输出线到,((外振幅-内振幅),外振幅-内振幅)),
(路径输出线到,((外振幅-内振幅),-(外振幅-内振幅)),
(路径out.LINETO,(外振幅-内振幅,-(外振幅-内振幅)),
(Path_out.LINETO,(外部_振幅-内部_振幅,外部_振幅-内部_振幅)),
(Path_out.LINETO,(外部_振幅,外部_振幅-内部_振幅)),
(路径_out.CLOSEPOLY,(外部_振幅,外部_振幅-内部_振幅)),
]
代码,垂直=zip(*路径输出数据)
path\u out=mpath.path(顶点、代码)
patch_out=mpatches.PathPatch(路径_out,facecolor='r',alpha=0.3)
ax.添加修补程序(修补程序)
plt.title(‘正方形中的正方形’)
ax.grid()
ax.轴(“相等”)
plt.show()
请注意,我考虑这个话题来进行代码审查,因为我正在寻找扩展我的功能,而不仅仅是一个符合最佳实践的重写。我觉得我完全错了。第一件事


假设多边形的外部有一个形状相同、宽度至少相同且内部完全填充的条带,那么如何使用matplotlib绘制具有一定宽度的多边形?

仅在matplotlib中处理多边形可能会非常乏味。幸运的是,有一个非常好的库用于此类操作:。 出于您的目的,
parallel\u 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(11111)

# 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, 'right', join_style=2, 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,0.4),
    edgecolor=(0,1,0,1), linewidth=3))
ax.add_patch(PolygonPatch(outer_poly, facecolor=(1,0,0,0.4),
    edgecolor=(1,0,0,1), linewidth=3))

# cosmetics
ax.set_aspect(1)
plt.axis([-1.5, 1.5, -1.5, 1.5])
plt.grid()
plt.show()
结果:


我不确定我是否正确理解了你的问题。你能澄清一下吗:a)你想处理任意多边形而不仅仅是矩形吗?b) 你的意见是什么?内部(绿色)多边形?c) 输出是什么?红色边框?@hitzg a)最好是任意多边形,但如果它一开始只在矩形上工作就可以了。b)
内部振幅
外部振幅
被视为输入,脚本不接受参数。这些是负责绿色(内部)和红色(外部)。c) 输出是绿色和红色之间的白色带。好的,谢谢。我有点困惑:我的印象是白色的带子不存在。如果只给出了
内部振幅
外部振幅
,那么什么定义了红色波段的宽度?@hitzg从技术上讲,白色波段不存在,它只通过反转图片而存在。我感兴趣的是多边形的边界,而不是多边形本身。红带的宽度在很大程度上是无关紧要的,除了我认为如果红带在白带大小的某个地方看起来会更好。它的宽度是由它自身的振幅和内部正方形的振幅决定的。我花了一段时间才复制出来,但效果很好:-)