2016-09-11 12 views
0

私は円柱状導波管内の様々な伝搬モードでEM波の電場ベクトルと磁場ベクトルのベクトルフィールドプロットを作成するPythonスクリプトを作成しました。私はベクトルフィールドプロットを生成するのにstreamplotを使用しました。私のプロットの画像を投稿することができれば、この質問はもっと簡単に聞かれるでしょうが、私の評判が現在10未満であるため、現在は私はできません。円の外側にあるプロットの部分を削除します

スクリプトの数学は円筒座標極プロット上でstreamplotを使用することの困難さに対して、私は、標準的な正方形のグリッド上に、(電気)フィールドベクトルをプロットしました: pyplot.streamplot(X, Y, UE, VE, linewidth=lwE, density=6,color='r')。興味があれば、lwEはスクリプト内の他の場所で定義され、その点のベクトルの大きさに応じて線幅を単純にスケーリングします。

とにかく私の問題は、正方形のグリッド上にプロットされているため、当然、フィールドベクトルはプロットのコーナーの円筒の断面の境界の外側にわずかに広がっていることです。私はちょうどベクトルフィールドの内側にの円筒を表示するプロットをしたい。この問題は極座標プロットを使用することで解決できますが、極座標プロットではstreamplotを使用することはできません。つまり、matplotlibは正方形のプロットを返します。私は私のシリンダーの円形断面の外側にあるプロットの部分を '切り取る'ことを望みます。

私は、プロットのこれらの不要な部分を「カットアウト」する最良の方法を知りたいと思います。私の最初の考えは、特定の半径の内側でゼロでない「サークル」関数(いくつかのソフトウェアパッケージで利用可能な円形アパーチャタイプ関数)をプロットすることでした。残念ながら、このような機能は利用可能ではないようです。私は私のプロット上に透明な円を重ね合わせてみましたが、関心のある領域をはっきりと強調していましたが、円の外側の「望ましくない」領域はまだ存在しています。私はこれらの部分を完全に削除します。

axes.set_xlim([-a,a])axes.set_ylim([-a,a])を使用してプロットの(x、y)の制限を設定できます。有用なのはこれの極限版です(たとえばaxes.set_rlim([0,a])。最初に極座標プロットを使用できるのは明らかですが、デカルト座標系を使用している場合はそのような制限コマンドが存在しますか?

答えて

0

クリップパスを使用できます。 Matplotibのドキュメントには、良い例があります:http://matplotlib.org/examples/images_contours_and_fields/image_demo_clip_path.html

+0

多くのありがとうございます。これは完全に機能しました。実際には – CrossProduct

+0

;私はちょうどこれが*画像*のために働いている間に(私の強度プロット、これは 'imshow'を使って行われます)、ストリームプロット(画像の上に置かれます)は依然としてクリッピング領域の外側に広がっていることを認識しました。だから私は途中にいる。正常に画像をクリップすることはできますが、通常のプロットはクリップできません。そのリンクはそのような場合について議論するようには見えない。 – CrossProduct

+0

すべてのmatplotlibアーティストにはset_clip_path()メソッドがあります。クリッピングするすべてのプロットオブジェクトでこれを使用します。 – jakevdp

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 
関連する問題