2016-07-16 19 views
8

matplotlibを使用して透明な背景を持ついくつかのgifを生成したいと思います。さまざまなオプションを試しましたが、透明な背景でファイルを取得することはできません。現在の設定では、そのような最初のフレームを取得しますが、残りのフレームは取得しません。アニメーションを取得する方法があります:以下は、結果として与え私のコード透明な背景を持つmplot3dアニメーション

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') 

ある

質問(あなたがそれをクリックすると、あなたはその1つのフレームだけが透明で見ることができます) mplot3dを使用して透明な背景?

enter image description here

+0

これはhttp://blog.adrian.pw/posts/2016/06/matplotlib-transparent-animation/ですか?あなたが探しているのは、 'fig.patch.set_alpha(0)'と 'ani.save( 'circle_anim.mov'、codec =" png "、dpi = 100、bitrate = -1、 savefig_kwargs = {'transparent':真、 'facecolor': 'none'}) '。私は今は試すことができませんが、後でそれを与えるでしょう。 –

+0

@JacquesGaudin、私はちょうどそれをチェックしました。それはクールですが、GIFとしてイメージをエクスポートしません。実際には、 '' savefig_kwargs''はGIFライターの使用時に無視されます。 – nicoguaro

+0

@JacquesGaudin、ちょうど試した:動作しません。 – nicoguaro

答えて

4

私はそれが本当にバグだと思います。 しかし、あなたがそこに着く方法よりも結果を気にしているなら、次のことがその仕事をするでしょう。アニメーションを呼び出す代わりに、各イメージを別々に保存してから、imageMagickを呼び出してアニメーションGIFに変換することができます。 以下のコードを参照し、convert.exeの引数に気を付けてください。

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とdeleteコマンドの呼び出しがシステム依存である可能性があることに注意してください。このスクリプトは、Windows 8でimageMagick 7.0.3(Q16)でテストされています。

+0

私はこのオプションについて考えていました。誰かがそれを他の方法でやり遂げることができることを望んでいる。答えを出すために、私は '' args''行を '' args = [path_to_convert、 "drum _ *。png"、 "-delay"、 "10"、 "-loop"、 "0"、 " - "に変更しました。 dispose "、" Background "、" output.gif "]' '。 – nicoguaro

+0

'' subprocess.call(["rm"、 "drum _ *。png"]、shell = False) '' 'のようなものを追加してPNGファイルを消去し、GIFだけを残すことができれば嬉しいです。 – nicoguaro

+0

pngファイルを削除する行を追加しました。 – ImportanceOfBeingErnest

関連する問題