2017-03-17 75 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