2012-06-13 5 views
8

私はmatplotlib 1.1.0を使ってサーフェスをプロットしています。python、numpy、matplotlibを使ってマスクされたサーフェスプロットをプロットする

プロット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) 

私は実際には本当の値を含んでいることを知っています。

全コード:

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 plot

これは私が(MathWorks社のMATLABから)何をしたいです:

何午前

matlab plot

私は行方不明?

+0

したがって、マスクされたデータは引き続き描画する必要がありますが、単色ですか? – fraxel

+0

はい、これは可能ですか? ...そうでなければ、マスクを描くだけで良い妥協です。 "colors.set_bad( 'k'、alpha = 0.5)で試してみましたが、プロットはまったく変更されませんでした。 – stanri

+0

マスクを使って可能になるとは思わない、 'plot_surface()' [マスクを尊重しない](https://github.com/matplotlib/matplotlib/issues/487)のように見えます。おそらく巧妙な回避策では可能ですが、現時点では私を打ち負かすでしょう:( – fraxel

答えて

1

あなたはそれを行うことができますが、表面を手作業で着色することによってそれを行う必要があります。

cmap関数は0と1の間のnubmerをとります。したがって、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) 

enter image description here

私はまた、matplotlibのは本当のあなたのz配列をキャストしていることを指摘しなければならない - 私は知りませんが、あなたが意図的にこの利点を取っているかどうか。

12

Fraxelは、surface_plotはマスキングをサポートしていないと述べました。

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

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

:問題を回避するためには、これは私がやったことですしかし、それは私のカラーマップスケーリングを台無しにしました。それにもかかわらず

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

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

Fixed

ない100私が望ん%が、良い妥協点:それを修正するには、私はこれをしませんでした。

関連する問題