删除位于圈子

时间:2016-09-11 04:04:32

标签: python matplotlib

我已经编写了一个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])。如果一个人能够首先使用极坐标图,这显然是微不足道的,但如果使用笛卡尔坐标轴,是否存在这样的限制命令?

2 个答案:

答案 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