python 3D matplotlib: x अक्ष स्थिति के आधार पर रंग



colors (1)

trisurf प्लॉट का रंग अपने जेड मूल्यों के अलावा किसी अन्य चीज़ के लिए सेट करना संभव नहीं है, क्योंकि दुर्भाग्यवश plot_trisurf 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()

प्रिय स्टैकहोवरफ्लो उपयोगकर्ता,

मैं 3 डी लिफाफे बनाने के लिए 3D मैप्लोटिबिल का उपयोग कर रहा हूं। अब तक मुझे लगभग जो मैं चाहता हूं, में सफलता प्राप्त हुई है, लेकिन एक आखिरी विवरण मैं हल करना चाहता हूं: मैं लिफाफे को एक्स अक्ष मानों के अनुसार रंगीन करना चाहूंगा, न कि 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))

यह निम्न आकृति उत्पन्न करता है:

मैं एक ही रंगों का उपयोग कैसे कर सकता हूं, लेकिन उन्हें z मानों के बजाय उन्हें x मानों के साथ जोड़ना है, जैसा कि वे स्वचालित रूप से लग रहे हैं?

अग्रिम में धन्यवाद! 🙂

सादर!





3d