2016-02-23 184 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