8

matplotlib1.1.0を使用してサーフェスをプロットしています。

プロットのZ軸は次のようにマスクされます。

Zm = ma.masked_where((abs(z_grid) < 1.09) & (abs(z_grid) > 0.91), (z_surface))
surf = ax.plot_surface(X, Y,Zm, rstride=2, cstride=2, cmap=colors,linewidth=0, antialiased=False)

しかし、私はプロットに適用されたマスクを見ていません。マスク自体をサブプロットとしてプロットしました

surf = ax.plot_surface(X, Y,ma.getmask(Zm), rstride=2, cstride=2, cmap=colors,linewidth=0, antialiased=False)

これはうまくいったので、私のマスクには実際にTrue値が含まれていることがわかります。

完全なコード:

from pylab import *
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
import numpy
from mpl_toolkits.mplot3d.axes3d import Axes3D
from  matplotlib import patches
from matplotlib.figure import Figure
from matplotlib import rcParams


fig = plt.figure(figsize=plt.figaspect(0.5))
ax = fig.add_subplot(1, 2, 1,projection='3d')

pole_positions_orig = [-0.6+0.73j];
zero_positions_orig = [0.29-0.41j];

surface_limit = 1.7;
min_val = -surface_limit;
max_val = surface_limit;

surface_resolution = 0.0333;

X = numpy.arange(min_val,max_val,surface_resolution)
Y = numpy.arange(min_val,max_val,surface_resolution)
X, Y = numpy.meshgrid(X, Y)

z_grid = X + Y*1j;
z_surface = z_grid*0;

pole_positions = numpy.round(pole_positions_orig,1) + surface_resolution/2+(surface_resolution/2)*1j;
zero_positions = numpy.round(zero_positions_orig,1) + surface_resolution/2 +(surface_resolution/2)*1j;

for k in range(0, len(zero_positions)):
    z_surface = z_surface + 20*log10((z_grid - zero_positions[k].real - zero_positions[k].imag*1j));
    z_surface = z_surface + 20*log10((z_grid - zero_positions[k].real + zero_positions[k].imag*1j));

for k in range(0, len(pole_positions)):
    z_surface = z_surface - 20*log10((z_grid - pole_positions[k].real - pole_positions[k].imag*1j));
    z_surface = z_surface - 20*log10((z_grid - pole_positions[k].real + pole_positions[k].imag*1j));    


colors = cm.jet;
colors.set_bad('k');


Zm = ma.masked_where((abs(z_grid) < 1.09) & (abs(z_grid) > 0.91), (z_surface))

z_surface = Zm;

surf = ax.plot_surface(X, Y,z_surface, rstride=2, cstride=2, cmap=colors,linewidth=0, antialiased=False)


ticks = [-1, 1]; 
z_ticks = [-30,-20,-10,0,10,20,30]; 
ax.set_xticks(ticks);
ax.set_yticks(ticks);   
ax.set_zticks(z_ticks);

ax.set_xlabel('Re')
ax.set_ylabel('Im')
ax.set_zlabel('Mag(db)',ha='left')
plt.setp(ax.get_zticklabels(), fontsize=7)
plt.setp(ax.get_xticklabels(), fontsize=7)  
plt.setp(ax.get_yticklabels(), fontsize=7)

ax = fig.add_subplot(1, 2, 2,projection='3d')
surf = ax.plot_surface(X, Y,ma.getmask(z_surface), rstride=2, cstride=2, cmap=colors,linewidth=0, antialiased=False)

ax.grid(b=None);
show();

これは私が持っているものです:

Pythonプロット

これは私が欲しいものです(matlabから):

matlabプロット

私は何が欠けていますか?

4

2 に答える 2

12

Fraxelは、surface_plotはマスキングをサポートしていないと述べました。問題を回避するために、これは私がしたことです:

私は基本的に、次のようにすべてのマスクされた値をnumpy.nanに設定することにより、z軸データを手動でマスクしました。

Zm = ma.masked_where((abs(z_grid) < 1.02) & (abs(z_grid) > 0.98), (z_surface))
z_surface[where(ma.getmask(Zm)==True)] = numpy.nan

Cmap Broken

しかし、それは私のカラーマップのスケーリングを台無しにしました。それを修正するために、私はこれを行いました:

cmap = cm.jet
lev = numpy.arange(-30,30,1);
norml = colors.BoundaryNorm(lev, 256)

surf = ax.plot_surface(X, Y, z_surface,...,norm = norml)

修理済み

私が望んでいたものを100%ではありませんが、それでも良い妥協点です。

于 2012-06-14T18:06:52.973 に答える
1

あなたはそれをすることができます、しかしあなたはあなた自身で表面の面を手動で着色することによってそれをする必要があります。

cmap関数は0から1の間の数値を取るため、cmap関数を呼び出す前に値を正規化する必要があります。

z_surface = numpy.real(z_surface)
min_z, max_z = z_surface.min(), z_surface.max()
colours = numpy.zeros_like(z_surface, dtype=object)

for i in range(len(z_surface)):
  for j in range(len(z_surface[0])):
    if 0.91 < numpy.sqrt(X[i,j]**2 + Y[i,j]**2) < 1.09:
      colours[i,j] = "red"  
    else:
      colours[i,j] = plt.get_cmap("jet")((z_surface[i,j]-min_z) / (max_z - min_z))


surf = ax.plot_surface(X, Y, z_surface, rstride=2, cstride=2, facecolors=colours, linewidth=0, antialiased=False)

ここに画像の説明を入力してください

また、matplotlibがz配列を実際にキャストしていることも指摘しておく必要があります。これを意図的に利用しているかどうかはわかりませんが、

于 2015-02-22T10:19:22.380 に答える