我已经编写了一个python脚本,它可以在圆柱形波导中以各种传播模式生成EM波的电场和磁场矢量的矢量场图。我使用streamplot
来生成矢量场图。如果我能够发布我的情节图像,我会更容易被问到这个问题,但由于目前我的声誉低于10,我目前无法这样做。
尽管脚本的数学是用圆柱坐标表示的,但是由于在极坐标图上使用streamplot
的困难,我使用以下方法在标准方格上绘制了横截面(电场)矢量图:
pyplot.streamplot(X, Y, UE, VE, linewidth=lwE, density=6,color='r')
。如果您有兴趣,我会在脚本的其他地方定义lwE,并根据此时矢量的大小简单地缩放线宽。
无论如何,我的问题是,自然地,由于被绘制在正方形网格上,场向量在图的角落中稍微延伸到圆柱体的横截面的边界之外。我只是希望绘图在圆柱体内显示内部的矢量场,而不是在外面。这个问题可以通过使用极坐标图解决,但我不能让streamplot
在极坐标图上工作。简而言之 - matplotlib返回一个方形图;我想减少'小区的部分位于我的圆柱体的圆形横截面之外。
我想知道最好的方法来减少'这些不需要的部分。我的第一个想法是策划一个' circ'功能(某些软件包中提供的圆孔类型功能),在一定半径范围内仅为非零;遗憾的是,似乎没有这样的功能。我已经尝试将透明圆圈叠加到我的情节上,虽然他们确实清楚地突出了感兴趣的区域,但是“不想要的”是圆圈外的区域仍然存在;我希望这些部分完全删除。
我可以使用axes.set_xlim([-a,a])
和来设置图的(x,y)限制
axes.set_ylim([-a,a])
;有用的是极性版本(比如axes.set_rlim([0,a]
)。如果一个人能够首先使用极坐标图,这显然是微不足道的,但如果使用笛卡尔坐标轴,是否存在这样的限制命令?
答案 0 :(得分:0)
您可以使用剪辑路径。 Matplotib的文档有一个很好的例子:http://matplotlib.org/examples/images_contours_and_fields/image_demo_clip_path.html
答案 1 :(得分:0)
你可以plot streamlines in polar coordinates。您还可以在笛卡尔坐标中剪切流线,如this plot:
import numpy
import matplotlib
from matplotlib import pyplot
from matplotlib.path import Path
from matplotlib.patches import PathPatch
x = numpy.linspace(-1, 1, 101)
x, y = numpy.meshgrid(x, x)
s, t, u, v = -y, x, x, y
# patch defining where streamlines would show
clip_patch = PathPatch(
Path([[1, 0], [0, 1], [-1, 0], [0, -1], [1, 0]]),
edgecolor='none', facecolor='none')
pyplot.gca().add_patch(clip_patch) # important!
# unclipped streamlines
pyplot.streamplot(x, y, s, t)
# clipped streamlines
plot = pyplot.streamplot(x, y, u, v)
plot.lines.set_clip_path(clip_patch)
for arrow_patch in pyplot.gca().patches[-len(plot.arrows.get_paths()):]:
arrow_patch.set_clip_path(clip_patch)
# matplotlib version
from matplotlib.patheffects import withStroke
white_border = withStroke(
linewidth=0.5*matplotlib.rcParams['font.size'], foreground='white')
pyplot.annotate(matplotlib.__version__, (0, 0), (-0.9, 0.9), 'data', 'data',
ha='left', va='top', path_effects=[white_border])
pyplot.xlim(-1, 1)
pyplot.ylim(-1, 1)
pyplot.savefig('stream.png') # or .pdf, but apparently not .svg