2017-03-17 77 views
2

尊敬的用戶#1,3D matplotlib:根據x軸位置的顏色

我使用3D matplotlib以產生3D信封。到目前爲止,我已經成功地獲得了我想要的東西,但是我想解決的最後一個細節是:我希望信封根據x軸值進行着色,而不是根據z軸值進行着色。 我承認我複製的部分代碼,以獲得圖形而不瞭解詳細的每一行,有保持神祕的對我的幾句話。每一行我不明白的是有註釋「這行我不明白」標記,這樣,如果你們中的一個懷疑我所需要的修改是在一條線上,我不明白,他們知道這一點,它可能幫助解決問題。這裏是工作代碼:

# ----- System libraries and plot parameters----- 

import argparse 
import re 
import glob, os, sys 
import subprocess 
import math 
import copy 
import hashlib 
import scipy 
from scipy import optimize 
import time 
from decimal import * 
import matplotlib.pyplot as plt 
import matplotlib.pylab as pylab 
import matplotlib.colors as colors 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.ticker import MaxNLocator 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 
from numpy.random import randn, shuffle 
from scipy import linspace, meshgrid, arange, empty, concatenate, newaxis, shape 
import numpy as np 
import numpy 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

params = {'legend.fontsize' : 70, 
      'figure.figsize' : (80, 30), 
      'axes.labelsize' : 70, 
      'axes.titlesize' : 70, 
      'xtick.labelsize' : 70, 
      'ytick.labelsize' : 70} 
pylab.rcParams.update(params) 
FFMPEG_BIN = "C:\Users\User\Desktop\ffmpeg-20170125-2080bc3-win64-static\bin\ffmpeg.exe" 

parser = argparse.ArgumentParser(description='utility to print 3D sigma profiles', formatter_class=argparse.RawDescriptionHelpFormatter) 
parser.add_argument('--name', type=str, help='name of prf and pot files without the extension, example for tempjob1.prf: --name="tempjob1"', default=["all"])  
args = parser.parse_args() 

#parse sigma profile 
name = args.name + ".prf" 
with open(name) as f: 
    sig_prof_set = f.read().splitlines() 
sigma  = list() 
profile  = list() 
sigma_set = list() 
profile_set = list() 
dieze  = 0 
for l in sig_prof_set: 
    if dieze < 2: #the first dummy compound should not be taken into account and once we reach the second compound, it is the first layer so we start the filling 
     if "#" in l: 
      dieze += 1 
     pass 
    else: 
     if "#" in l: 
      if dieze > 1: #each time we reach a dieze, we store the sigma profile gathered into the sigma profile set and empty the list for the next 
       sigma_set.append(sigma) 
       profile_set.append(profile) 
       sigma  = list() 
       profile  = list() 
      dieze += 1 #the first dummy compound should not be taken into account  
     else: 
      splitted = l.split() 
      sigma.append(splitted[0]) 
      profile.append(splitted[1]) 

#display 3D plot 
fig = plt.figure() 

#convert data to numpy arrays 
sigma_set  = numpy.array(sigma_set) 
profile_set = numpy.array(profile_set) 
potential_set = numpy.array(potential_set) 

#shape data for graphs 
layer    = numpy.array(range(len(sigma_set))) 
layer_flatten  = list() 
sigma_flatten  = list() 
profile_flatten = list() 
potential_flatten = list() 

#X is sigma, Y is layer number, Z is profile or potential 
for i in layer: 
    for j in range(len(sigma_set[0])): 
     layer_flatten.append(layer[i]) 
     sigma_flatten.append(float(sigma_set[i][j])) 
     profile_flatten.append(float(profile_set[i][j])) 
     potential_flatten.append(float(potential_set[i][j])) 

#assign graph data   
X = numpy.array(sigma_flatten) 
Y = numpy.array(layer_flatten) 
Z1 = numpy.array(profile_flatten) 
Z2 = numpy.array(potential_flatten) 

#actually make 3D plot 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') #Here line I don't understand 

surf = ax.plot_trisurf(X, Y, Z1, cmap=cm.jet, linewidth=0) 
fig.colorbar(surf) 

#set title of graph and axes 
title = ax.set_title("Z-dependent sigma-profile") 
title.set_y(1.01)       #Here line I don't understand 
ax.xaxis.set_major_locator(MaxNLocator(5)) #Here line I don't understand 
ax.yaxis.set_major_locator(MaxNLocator(6)) #Here line I don't understand 
ax.zaxis.set_major_locator(MaxNLocator(5)) #Here line I don't understand 
ax.set_xlabel('sigma (e/A^2)') 
ax.set_ylabel('layer') 
ax.set_zlabel('p(sigma)') 
ax.xaxis.labelpad = 100 
ax.yaxis.labelpad = 70 
ax.zaxis.labelpad = 70 

fig.tight_layout()       #Here line I don't understand 

#save the figure 
fig.savefig('3D_sig_prf{}.png'.format(args.name)) 

這會產生如下圖所示: the 3D plot colored according to z values

我如何可以使用相同的顏色,但他們,因爲他們似乎是自動關聯到x值,而不是z值?

在此先感謝!

此致敬禮!

+0

'ax.xaxis.set_major_locator(MaxNLocator(5))'只是設置顯示在指定軸上 – DavidG

回答

2

trisurf圖的顏色設置爲其它Z值以外的東西是不可能的,因爲不幸的是plot_trisurfignores the facecolors的說法。

但是使用通常的surface_plot使得能夠提供顏色的陣列,以facecolors

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

X,Y = np.meshgrid(np.arange(10), np.arange(10)) 
Z = np.sin(X) + np.sin(Y) 
x = X.flatten() 
y = Y.flatten() 
z = Z.flatten() 

fig = plt.figure(figsize=(9,3.2)) 
plt.subplots_adjust(0,0.07,1,1,0,0) 
ax = fig.add_subplot(121, projection='3d') 
ax2 = fig.add_subplot(122, projection='3d') 
ax.set_title("trisurf with color acc. to z") 
ax2.set_title("surface with color acc. to x") 

ax.plot_trisurf(x,y,z , cmap="magma") 

colors =plt.cm.magma((X-X.min())/float((X-X.min()).max())) 
ax2.plot_surface(X,Y,Z ,facecolors=colors, linewidth=0, shade=False) 

ax.set_xlabel("x") 
ax2.set_xlabel("x") 
plt.show() 

enter image description here

+0

由於蜱的數量,它的工作! 但我必須更好地使用顏色: ax2.plot_surface(X,Y,Z,facecolors = colors,rstride = 1,cstride = 1)而不是 ax2.plot_surface(X,Y,Z,facecolors =顏色,線寬= 0,陰影=假) 因爲否則我的具體數據看起來不好。 – Glxblt76