Python Matplotlib颜色栏/颜色映射设置

Python Matplotlib颜色栏/颜色映射设置,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我做了一个测试,但是颜色条一直在移动,我不知道为什么。我认为这是因为它在每一帧后都会正常化。如何设置颜色映射设置,使颜色栏保持不变 代码:警告:此PRGRAM将删除其所调用目录中的文件夹png3D。根据您的计算能力,生成所有帧也可能需要一段时间 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import tim

我做了一个测试,但是颜色条一直在移动,我不知道为什么。我认为这是因为它在每一帧后都会正常化。如何设置颜色映射设置,使颜色栏保持不变

代码:警告:此PRGRAM将删除其所调用目录中的文件夹png3D。根据您的计算能力,生成所有帧也可能需要一段时间

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import time
import sys,os,shutil
time.clock()

def FUNCTION(p,r,t):
    k_0,dx,c = p
    x,y = r
    x,y = np.meshgrid(x,y)
    r = np.sqrt(x**2 + y**2)
    z = np.exp(1j*(k_0[0]*x+k_0[1]*y-c*t))*np.exp(-((r-c*t)/(2*dx))**2 )*0.5**(r/x[0][-1]/2)
    z = abs(z)
    return(x,y,z)

def PRINT_PNG(x,y,t,folder):
    x,y,z = FUNCTION(p,r,t)

    fig = plt.figure()
    sub = fig.gca(projection='3d')
    fig.suptitle("3D Wavepackage", size="large")
    sub.set_zlim([0,1.5])
    sub.set_xlabel("x",size="large")
    sub.set_ylabel("y",size="large")
    sub.set_zlabel("$Re[\psi(x,t)]$",size="large",ha="right")   
    sub.text(0.5,0.5,0.5,"t = "+str("%3.1f"%t)+" s",transform = sub.transAxes, ha="right")

    surf = sub.plot_surface(x,y,z,linewidth=0,cmap=cm.coolwarm)
    fig.colorbar(surf, shrink=0.5, aspect=5)
    file_name = os.path.abspath(folder+"/tmp"+str("%04d"%i)+".png")
    fig.savefig(file_name)
    plt.close()

# Parameters
T = 10
N = 100
n = 24*T # 24 Frames pro Sekunde
t = np.linspace(0,T,n)
k_0 = [1,1]
dx  = 1
c   = 1
p = [k_0,dx,c]

x   = np.linspace(-c*T,c*T,N)
y   = np.linspace(-c*T,c*T,N)
r=[x,y]


# Baue Ordner
folder = os.path.abspath("png3D")
if os.path.exists(folder)==True:
    shutil.rmtree(folder)
    os.makedirs(folder)
else:
    os.makedirs(folder)

for i in range(n):
    PRINT_PNG(x,y,t[i],folder)
    print(str(i+1)+"/"+str(n))

file_name = os.path.abspath("png3D//tmp%04d.png")
os.system("ffmpeg -f image2 -y -i "+file_name+" -r 24 -bit_rate 1800 3D_Wave.mpeg")
shutil.rmtree(folder)
print(time.clock())

您可以将
vmin
vmax
关键字参数传递给
plot\u surface
,以指定绘图的值范围:

surf = sub.plot_surface(x,y,z,linewidth=0,cmap=cm.coolwarm,vmin=0,vmax=1)

有关更多信息,请参阅。

虽然我对给出示例代码表示欢迎,但最好将代码简化为a)快速运行,b)不干扰本地文件。我看不出有任何方法可以做到这一点。我尝试使用matplotlib的动画模块,但它在一定程度上不适用于python 3.3,并且不支持某些3D打印(看起来)。因此,如果没有电影或动画,我如何简单地修改代码,使其不首先保存电影的图像?您也可以在绘制后使用
surf.set_clim([vmin,vmax])
。这正是我需要的,谢谢。还有一个战略问题:你是碰巧知道还是在什么地方查到的?我查看了matplotlib文档,但找不到此设置。这是一个好问题。我通过使用
imshow
了解了
vmin
vmax
关键字参数,因此在matplotlib站点上搜索了
plot\u surface
,并看到了这些参数的列表。