2015-12-02 122 views
1

我想在mplot3d表面下得到一个很好的contourf图。 我希望它出现在3D轴立方体的地板上,并与我的数据下限有一点偏移。 现在我在做这样的事情:mplot3d:contourf偏移量,限制和刻度

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

N = 50 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

surface = np.zeros((N,N)) 

# gaussian 
for x in np.arange(N, dtype=float): 
    for y in np.arange(N, dtype=float): 
     sigma = 0.2 
     xn = (x - N/2)/N 
     yn = (y - N/2)/N 
     r = np.sqrt(xn**2.0 + yn**2.0) 
     surface[x,y] = np.exp((-r**2.0)/(2.0*sigma**2.0)) 

# mesh grid NxN points in [0,1] 
gx, gy = np.meshgrid(np.linspace(0,1,N),np.linspace(0,1,N)) 

ax.plot_surface(gx, gy, surface, rstride=2, cstride=2, cmap=mpl.cm.Spectral) 

# extend z axis limit to make room for contourf 
ax.set_zlim3d(np.min(surface) - 0.5, np.max(surface)) 

# contour on the floor 
levels = np.linspace(np.min(surface), np.max(surface), 20) 
ax.contourf(gx, gy, surface, levels=levels, 
      offset=(np.min(surface) - 0.5), cmap=mpl.cm.Spectral) 

That plots this image

这看起来不错,但它增加了一些,我的数据最低下延长z轴的刻度。我不希望在最小值以下显示任何刻度,但仍然延长zaxis以抵消contourf图。

有什么想法?我该如何隐藏或不画所有红色圆圈蜱?

+1

'ax.get_zticks','ax.set_zticks' – gboffi

+1

'numpy'允许矢量表达式,如'的x,y = np.meshgrid(np.linspace(0,1,N) - 0.5,NP .linspace(0,1,N)-0.5)'和'surface = np.exp( - (x ** 2 + y ** 2)/ 0.08)' – gboffi

+0

感谢@gboffi这工作'ax.set_zticks(filter lambda x:s_min <= x <= s_max,ax.get_zticks()))' – filippo

回答

1

这比我想象的要容易得多,非常感谢@gboffi指出我正确的apis。

s_min = np.min(surface) 
s_max = np.max(surface) 

# filter out extra ticks that exceed data limits 
ax.set_zticks(filter(lambda x: s_min <= x <= s_max, ax.get_zticks()))