2013-08-03 3 views
3

Я сделал animation of a wave, но цветная панель продолжает перемещаться, и я не знаю почему. Я думаю, это потому, что он нормализуется после каждого кадра. Как установить цветную настройку, чтобы цветная панель оставалась прежней?Python Matplotlib Colorbar/Colormap Настройки

Код: ПРЕДУПРЕЖДЕНИЕ: эта программа уничтожает папку 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()) 
+0

Хотя я приветствую дать пример кода, было бы лучше упростить вам код: a) быстро запустить и b) не гадать с локальными файлами. – tacaswell

+0

Я не вижу никакого способа это сделать. Я попытался использовать модуль анимации matplotlib, но частично не работает с python 3.3 и не поддерживает какой-либо 3D-график (кажется). Итак, без фильма или анимации, как я просто код, чтобы не сохранять изображения для фильма в первую очередь? – throwaway17434

ответ

3

Вы можете передать vmin и vmax именованных аргументов в plot_surface, которые определяют диапазон значений для вашего участка:

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

Смотрите the docs для получения дополнительной информации.

+1

Вы также можете использовать 'surf.set_clim ([vmin, vmax])' после его построения. – tacaswell

+0

Это именно то, что мне нужно, спасибо. И по стратегическому вопросу: Вы случайно узнали об этом, или вы где-то выглядели? Я просмотрел документацию matplotlib, но не смог найти эту настройку. – throwaway17434

+0

Это хороший вопрос. Я знал о аргументах 'vmin' и' vmax' от использования 'imshow', поэтому искал' plot_surface' на сайте matplotlib и видел, что они были перечислены. – lmjohns3

Смежные вопросы