2016-02-23 139 views
2

的是否有可能在一个pyplot图绘制多个曲面?这是我的尝试。 ax.plot_surface命令似乎重置了这个数字,因为我只在结果图中得到一个平面。我希望能够制作出具有不同颜色的“堆叠”平面,并且显示每种颜色的数值。目前我的颜色显示错误。matplotlib正确的颜色/彩条与多面积每一种不同的颜色

import numpy as np 
import pandas as pd 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 
import pylab 
from scipy.interpolate import griddata 

dat = open('ex.csv', 'w') 
dat.write('x,y,z,c\n') 
for x in range(20): 
    for y in range(20): 
     for c in range(0,7): 
      dat.write(','.join([str(s) for s in [x,y,x+y+c,c/10.0,'\n']])) 
dat.close() 

fig = matplotlib.pyplot.gcf() 
dat = np.genfromtxt('ex.csv', delimiter=',',skip_header=1) 
X_dat = dat[:,0] 
Y_dat = dat[:,1] 
Z_dat = dat[:,2] 
C_dat = dat[:,3] 
ax1 = fig.add_subplot(111, projection='3d') 
for color in np.unique(C_dat): 
    X, Y, Z, C = np.array([]), np.array([]), np.array([]), np.array([]) 
    for i in range(len(X_dat)): 
     if C_dat[i]==color: 
      X = np.append(X,X_dat[i]) 
      Y = np.append(Y,Y_dat[i]) 
      Z = np.append(Z,Z_dat[i]) 
      C = np.append(C,C_dat[i]) 

    xi = np.linspace(X.min(),X.max(),100) 
    yi = np.linspace(Y.min(),Y.max(),100) 

    zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic') 
    ci = griddata((X, Y), C, (xi[None,:], yi[:,None]), method='cubic') 

    xig, yig = np.meshgrid(xi, yi) 
    surf = ax1.plot_surface(xig, yig, zi,facecolors=cm.rainbow(ci), alpha = 0.7) 

xi = np.linspace(X_dat.min(),X_dat.max(),100) 
yi = np.linspace(Y_dat.min(),Y_dat.max(),100) 
ci = griddata((X_dat, Y_dat), C_dat, (xi[None,:], yi[:,None]), method='cubic') 
m = cm.ScalarMappable(cmap=cm.rainbow) 
m.set_array(ci) 
col = plt.colorbar(m) 
plt.show() 

enter image description here (应该有一个红色平面)

+1

编辑您的问题,这样的无效答案(S)已经给出。下次再问一个新问题会更好。 –

+0

@tom我真的认为我发布的代码是一个MCVE – kilojoules

+0

@tom但我生成代码 – kilojoules

回答

3

移动线

ax1 = fig.add_subplot(111, projection='3d') 

for color in...循环之外。通过重新创建轴每次迭代,你隐藏先前创建的表面


编辑(回答有关颜色表的第二个问题)

您需要normalise您的数据。目前,你有facecolors在0〜0.6的范围内,所以当你喂最大(0.6),以cm.rainbow,你就会得到绿色,不红(因为它预计到1的范围为0)。

这里有一个修改后的脚本,我认为作品,因为它应该。我们使用Normalisematplotlib.colorsvminvmaxC_dat数据确定。然后,使用facecolors=cm.rainbow(norm(ci))来设置曲面的颜色。

然后,您还想使用C_dat中的值设置ScalarMappable的数组,因此我们不需要在此再次使用griddata

import numpy as np 
import pandas as pd 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import matplotlib.colors as colors 
from mpl_toolkits.mplot3d import Axes3D 
import pylab 
from scipy.interpolate import griddata 

dat = open('ex.csv', 'w') 
dat.write('x,y,z,c\n') 
for x in range(20): 
    for y in range(20): 
     for c in range(0,7): 
      dat.write(','.join([str(s) for s in [x,y,x+y+c,c/10.0,'\n']])) 
dat.close() 

fig = matplotlib.pyplot.gcf() 
dat = np.genfromtxt('ex.csv', delimiter=',',skip_header=1) 
X_dat = dat[:,0] 
Y_dat = dat[:,1] 
Z_dat = dat[:,2] 
C_dat = dat[:,3] 

# Create a Normalize instance. 
norm = colors.Normalize(vmin=C_dat.min(),vmax=C_dat.max()) 

ax1 = fig.add_subplot(111, projection='3d') 
for color in np.unique(C_dat): 
    X, Y, Z, C = np.array([]), np.array([]), np.array([]), np.array([]) 
    for i in range(len(X_dat)): 
     if C_dat[i]==color: 
      X = np.append(X,X_dat[i]) 
      Y = np.append(Y,Y_dat[i]) 
      Z = np.append(Z,Z_dat[i]) 
      C = np.append(C,C_dat[i]) 

    xi = np.linspace(X.min(),X.max(),100) 
    yi = np.linspace(Y.min(),Y.max(),100) 

    zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic') 
    ci = griddata((X, Y), C, (xi[None,:], yi[:,None]), method='cubic') 

    xig, yig = np.meshgrid(xi, yi) 

    # Note the use of norm in the facecolors option 
    surf = ax1.plot_surface(xig, yig, zi,facecolors=cm.rainbow(norm(ci)), alpha = 0.7) 

m = cm.ScalarMappable(cmap=cm.rainbow) 
m.set_array(np.unique(C_dat)) 

col = plt.colorbar(m) 

plt.show() 

enter image description here