python曲面图代码_使用python,numpy和matplotlib绘制蒙版曲面图

I'm plotting a surface using matplotlib 1.1.0.

The plot Z axis is masked like so:

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)

But I'm not seeing the mask applied on the plot. I plotted the mask itself as a subplot

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

Which worked, so I know my mask does actually contain True values.

Full code:

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();

This is what I have:

This is what I want (from matlab):

What am I missing?

解决方案

You can do it, but you need to do it by manually colouring the surface faces yourself;

the cmap function takes a nubmer between 0 and 1, so we just need to normalise the values before calling the cmap function on them.

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)

I should also point out that matplotlib is casting your z array to real - whether or not you are taking advantage of this on purpose though i don't know.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值