2016-07-16 17 views
8

Matplotlib kullanarak şeffaf arka plan ile bazı gifler oluşturmak istiyorum. Farklı seçenekler denedim ancak dosyalarımı şeffaf arka plan ile alamıyorum. Mevcut kurulum ile ilk çerçeveyi böyle elde ediyorum ama geri kalanını değil. animasyon almanın bir yolu var mı: Aşağıdaki sonucu verir benim kodmplot3d animasyon

from __future__ import division 
from numpy import pi, sin, cos, mgrid 
from scipy.special import jn, jn_zeros 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib import rcParams 


# In Windows the next line should provide the full path to convert.exe 
# since convert is a Windows command 
rcParams['animation.convert_path'] = "C:\Program Files\ImageMagick-6.9.3\convert.exe" 
rcParams['savefig.transparent'] = True 
rcParams['savefig.dpi'] = 130 
rcParams['savefig.pad_inches'] = 0 
plot_args = {'rstride': 1, 'cstride': 1, 'cmap':"RdYlBu", 
      'linewidth': 0.5, 'antialiased': True, 'color': '#1e1e1e', 
      'shade': True, 'alpha': 1.0, 'vmin': -1, 'vmax':1} 


def data_gen(num): 
    ax.cla() 
    m, n = 1, 2 
    lam = jn_zeros(m, n)[-1] 
    dt = 2*pi/(30*lam) 
    z = cos(m*t)*jn(m, lam*r)*sin(lam*num*dt) 
    surf = ax.plot_surface(x, y, z, **plot_args) 
    ax.view_init(elev=30, azim=45) 
    ax.set_xlim(-0.6, 0.6) 
    ax.set_ylim(-0.6, 0.6) 
    ax.set_zlim(-1, 1) 
    plt.axis("off") 
    return surf 


r, t = mgrid[0:1:20j, 0:2*pi:40j] 
x, y = r*cos(t), r*sin(t) 
fig = plt.figure(facecolor=None) 
ax = fig.add_subplot(111, projection='3d') 
ani = animation.FuncAnimation(fig, data_gen, range(30), blit=False) 
ani.save("Drum vibration mode.gif", writer='imagemagick') 

olduğunu

Soru (bunu tıklarsanız, o sadece bir çerçeve şeffaf görebilir) mplot3d kullanarak şeffaf arka plan ile?

enter image description here

+0

Bu http://blog.adrian.pw/posts/2016/06/matplotlib-transparent-animation/? Görünüşe göre aradığınız şey 'fig.patch.set_alpha (0.)' ve ani.save ('circle_anim.mov', codec = "png", dpi = 100, bitrate = -1, savefig_kwargs = {'transparent': Doğru, 'facecolor': 'none'}) '. Şimdi deneyemem ama daha sonra vereceğim. –

+0

@JacquesGaudin, Sadece kontrol ettim. Bu harika, ancak resmi GIF olarak dışa aktarmıyor. Gerçekten de, GIF yazarını kullanırken 'savefig_kwargs'' göz ardı edilir. – nicoguaro

+0

@JacquesGaudin, sadece denedi: çalışmıyor. – nicoguaro

cevap

4

Ben gerçekten bir hata olduğunu düşünüyorum. Bununla birlikte, sonuca oraya ulaşmanın yolundan daha çok önem verirseniz, aşağıdakiler işi yapardı. Animasyonu çağırmak yerine, her görüntüyü ayrı ayrı kaydedebilir ve ardından bunları animasyonlu bir gif'e dönüştürmek için imageMagick'i çağırabilirsiniz. Aşağıdaki kodu inceleyin ve convert.exe dosyasını argümanlara dikkat edin.

from __future__ import division 
from numpy import pi, sin, cos, mgrid 
from scipy.special import jn, jn_zeros 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

from matplotlib import rcParams 
import subprocess 


# In Windows the next line should provide the full path to convert.exe 
# since convert is a Windows command 
path_to_convert = "C:\Program Files\ImageMagick-6.9.3\convert.exe" 
#rcParams['animation.convert_path'] = path_to_convert 
rcParams['savefig.transparent'] = True 
rcParams['savefig.dpi'] = 130 
rcParams['savefig.pad_inches'] = 0 
plot_args = {'rstride': 1, 'cstride': 1, 'cmap':"RdYlBu", 
      'linewidth': 0.5, 'antialiased': True, 'color': '#1e1e1e', 
      'shade': True, 'alpha': 1.0, 'vmin': -1, 'vmax':1} 


def data_gen(num): 
    ax.cla() 
    ax.clear() 
    m, n = 1, 2 
    lam = jn_zeros(m, n)[-1] 
    dt = 2*pi/(30*lam) 
    z = cos(m*t)*jn(m, lam*r)*sin(lam*num*dt) 
    surf = ax.plot_surface(x, y, z, **plot_args) 
    ax.view_init(elev=30, azim=45) 
    ax.set_xlim(-0.6, 0.6) 
    ax.set_ylim(-0.6, 0.6) 
    ax.set_zlim(-1, 1) 
    ax.axis("off") 
    fig.patch.set_visible(False) 
    ax.patch.set_visible(False) 
    ax.set_axis_off() 
    ax._axis3don = False 
    return surf 


r, t = mgrid[0:1:20j, 0:2*pi:40j] 
x, y = r*cos(t), r*sin(t) 
fig = plt.figure(facecolor=None, frameon=False) 
ax = fig.add_subplot(111, projection='3d') 
for i in range(30): 
    data_gen(i) 
    plt.savefig("drum_{n:02d}.png".format(n=i), transparent=True, frameon=False) 
    print i, 

args = [path_to_convert, "-delay", "10", "-loop" , "0", "-dispose", "Background", "drum_*.png", "output.gif"] 
subprocess.call(args, shell=True) 
subprocess.call(["del", "/Q", "drum_*.png"], shell=True) 
print "\ndone" 

ImageMagick çağrılarının ve silme komutlarının sisteme bağlı olabileceğini unutmayın. Bu betik, Windows 8 altındaki imageMagick 7.0.3 (Q16) ile test edilmiştir.

+0

Bu seçenek hakkında düşünüyordum ama Birinin bunu başka şekilde yapabileceğini umarak. İşinizi cevaplamak için '' args'' satırını '' args = [path_to_convert, 'drum _ *. Png', '-delay', '10', '-loop', '0', '- olarak değiştirdim "," Arkaplan "," output.gif "] 'i imha edin. – nicoguaro

+0

Eğer altprocess.call (["rm", "drum _ *. Png"], shell = False) gibi bir şey ekleyebilirsek PNG dosyalarını silebilir ve GIF’i saklayabiliriz. – nicoguaro

+0

Png dosyalarından kurtulmak için bir satır ekledim. – ImportanceOfBeingErnest