• 締切済み

matplotlibのグラフgif動画の背景透過法

現在、以下の解説サイトを参考に、 タイマーカウントありのグラフ動画の作成をArtistAnimationにて試みています。 https://www.yutaka-note.com/entry/matplotlib_artist_anim 「plt.show()」による表示だけでなく、gif動画で自動保存したいため、 参考サイトどおり以下のコードを末尾に追加しています。 anim.save("ファイル名.gif", writer="pillow") ただ、背景(グラフ領域と余白部分)を透明化(透過)させたいため、 以下のコードをグラフ領域の作成直後に追加しています。 fig.patch.set_alpha(0.0) すると、自動保存されたgifファイルは、背景の透明化はされているものの、 タイマー文字ならびにグラフ枠線や軸タイトルといったレイアウトが全て上書きされて出力されてしまいました。 (画像参照、タイマー文字は潰れ、グラフレイアウトはジャギーのようになっています。) 「plt.show()」での表示はきちんと背景が透明化された上で想定通りの挙動を示しているため、 原因としては「anim.save()」の部分だと考えているのですが、 色々と試行錯誤しても想定通りの挙動(上書きされずに透明化)が叶いません。 pillowライブラリの構造の関係で無理筋なのかもしれませんが、 gifファイル自動保存の前提を崩さない上で、上手いコーディング方法をご存じの方がもしおられましたら、 教えていただけますと助かります。 (出力後の別途の画像コンバートや、ffmpeg等の外部ツールを入れてのMP4出力は考えていません。 できるだけ簡便な手法を望んでいます。) 【以下、問題としているサンプルコード】 # 1. 必要なモジュールの読み込み import numpy as np from matplotlib import pyplot as plt from matplotlib.animation import ArtistAnimation # 2.グラフ領域の作成 fig, ax = plt.subplots() fig.patch.set_alpha(0.0) #背景部分の透明化 # 3. アニメーション要素のリスト artists = [] for i in range(100): x = np.linspace(0, 4*np.pi) y = np.sin(x - i/100 * 2*np.pi) # アニメーション化する要素の準備 my_line, = ax.plot(x, y,"blue") my_text = ax.text(0, y[0], " ? inlet", color="darkblue", size ="large") my_title = ax.text( 4.5, 1.15, f"Count = {i}", size="xx-large") # アニメーション化する要素をリスト化 artists.append([my_line, my_text, my_title]) # 4. アニメーション化 anim = ArtistAnimation(fig, artists, interval=50) plt.show() anim.save("ファイル名.gif", writer="pillow") #透明化はされるがgifファイル上で文字が上書きされる

  • Python
  • 回答数1
  • ありがとう数0

みんなの回答

  • asciiz
  • ベストアンサー率70% (6629/9392)
回答No.1

GIF画像の透明化と言うのは、定義された色パレットのうち、指定した1色を透明として扱う、と言う方式であるため、そのままではタイマー数字が重なって行くのは当然の動作となります。 ライブラリと言うよりは、「GIF画像の仕様」の話となります。 それを避けるために、タイマー数字の背景に別の色の箱を書いて不透明化してはどうでしょう。 「Count=」の文字や、軸数値においても中間色が重なってジャギーが出てしまうのも同じ問題なので、そこの背景色として真っ白ではなく、ほんのわずかなグレー等を置いておけば、透明化されずに綺麗な文字が出ると思います。

関連するQ&A

  • 画像回転アニメ

    Pythonで読み込んだ画像を360度回転するgifアニメにしたく見よう見まねで下記コードを書きました。 走り出してしばらくすると” list index out of range”などのエラーが出ます。どうしたらエラーをなくせるでしょうか?ご教示のほどよろしくお願いします。なお、Colaboratoryを使用しています。 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib.animation import PillowWriter from PIL import Image fig = plt.figure(figsize=(8,6),dpi=100) fig,ax=plt.subplots(1,1) ax.set_aspect('equal') rotor=Image.open('/rotor.png') ims = [] for i in range(360): im=rotor.rotate(angle=i,resample=Image.BICUBIC,expand=False) ims.append(im) anim = animation.ArtistAnimation(fig,ims) anim.save('ani.gif',writer="pillow",fps=10)

  • Jupyter notebook上でのアニメ出力

    Jupyter notebookでグラフを出力しながら実習しているのですが、アニメを表示するところでエラーになります。 jupyte notebookのスクリプト抜粋 fig = plt.figure(figsize=(10,7)) anim = ani.FuncAnimation(fig, animate, frames=int(num_frame), blit=True) anim.save('likelihood.gif', writer='imagemagick', fps=1, dpi=64) ←ここ ↓ 実行結果エラーが出る。 エラーメッセージの抜粋 anim.save('likelihood.gif', writer='imagemagick', fps=1, dpi=64) ←ここ animation.py in _draw_frame(self, framedata) raise RuntimeError('The animation function must return a ''sequence of Artist objects.') 何か前提とされているものをimportしていないのか、あるいは外部のアニメ作成ツールを呼び出して利用したいけどできないと言っているのかだと思うのですが。 メッセージにimagemagickとかgifアニメとか割とおなじみの名前があり、外部を呼び出そうしているなと思ったのですが。pythonは外部のC++コンパイラを利用したりするのでその方向なのかなと思ったのですが。OSはWindows10です。 プロンプトではimagemagickというコマンドは起動しません。一応インストールはしているのですが、インストール先を見てもimagemagickという実行ファイルがないようなのですが。よろしくお願いします。

  • フリーウェア Animation GIF Make がおかしい

    パソコン初心者ですが、宜しくお願いします。パソコンは東芝dynabook AX/840LS で、OSはXP-HOMEです。 昨日、フリーソフトウェアのAnimation GIF MakerとJTrimを使って、GIFアニメ(犬がウインクするやつ)を作成して、その作品をMSNのHot Mailの添付ファイルとして友人に送付しました。本日、作品を作成するのにAnimation GIF Makerを立ち上げて、元画像の保管先のCドライブのMy Pictureのホルダーをクリックしたのですが、なぜか何も反応が無く、画像が取り出せません。ちなみにMy Pictureに元画像があるのは確認済みです。原因として何が考えられますか。また最悪の場合、Animation GIF Maker を削除しようと思いますが、どの削除方法がベストですか。宜しくお願いします。

  • matplotlibのプロットに配列を使用する方法

    下記のサイト等を参考にして、PythonのmatplotlibのFuncAnimationにて、 グラフプロットのアニメーションを作ろうとしています。 https://sabopy.com/py/matplotlib-animation-62/ https://www.yutaka-note.com/entry/matplotlib_func_anim 測定データ(n個)毎、および測定時間(m個)毎に、プロットするべきデータがx軸, y軸でそれぞれ存在し、 それらプロットの数値は各々、【plot_data_x[n][m]】, 【plot_data_y[n][m]】という配列に予め格納されているとします。 その上で、 for counter in range(n): for counter in range(m): plot_list[n][m], = ax.plot([], []) for counter in range(n): for counter in range(m): plot_list[n][m].set_data((plot_data_x[n][m], plot_data_y[n][m])) というような形にすると、【set_data】メソッドが正常に機能しないのか、予約後表記にもならず(VSCode環境)エラーで弾かれます。 (あるいは【plot_list[n][m]】が想定通りに初期化されていない?) for文を使わず【plot1_1】,【plot1_2】…のように単一の変数を列挙する形式であれば動作したのですが、 どうしても配列になると動いてくれません。 これはそもそも【ax.plot】や【.set_data】が配列に対応していないのでしょうか。 それともコードのどこかしらに間違いがあるのでしょうか。 お手数をおかけして申し訳ありませんが、 どなたか詳しい方おられましたら配列で動かす手段を教えていただけますと助かります。 よろしくお願いします。

  • Gif背景透過の書込み

    Gif背景透過で、保存したアニメを見たら 多少劣化している場合があるのです。 (いつもでは無いのですが) これは、ソフトが悪いのか?PCの何だかの設定なのでしようか? もしくは透過埋め込みや色の埋め込みは目には同じ色に見えても 完全にその色で焼きこまれていない為なのでしょうか? *アニメ、グラフィック部で詳しいかた、そんな経験のある方いましたらよろしくです。

  • またまた困ってます。

    ◆実現したいこと。(困っていること。) 以下の内容から、生成されるグラフのx軸にキーワード検索で対応した 行の各ブロック(100、200、300)を同時に取得し、 それをグラフのx軸に表示させたいのですが、どうすればできるでしょうか? 取り込むテキストファイルの内容は以下のとおりです。 <100> A 1-1 電球,"10","1" A 2-1 テレビ,"20","2" A 3-1 エアコン,"30","3" A 4-1 コンロ,"40","4" A 5-1 せんぷうき,"50","5" A 6-10 電卓,"60","6" //200// A 1-1 とうがらし,"150","20" A 2-1 なす,"160","21" A 3-1 とまと,"210","22" A 4-1 きゃべつ,"320","23" A 5-1 だいこん,"220","24" B 6-10 あぼがど,"340","25" ・300 A 1-1 やきとり定食,"98","30" A 2-1 野菜定食,"198","31" A 3-1 とんかつ定食,"298","32" A 4-1 やきにく定食,"398","33" A 5-1 こんもり定食,"498","34" A 6-10 まかない定食,"99","35" #コード import re import numpy as np import matplotlib.pyplot as plt def extract_text_in_file(filepath, keyword): extracted_text_array = [] with open(filepath, encoding="utf-8") as f: line = f.readline() # 1行ずつ処理 while line: if re.search(keyword, line): # 抽出したいキーワード行を取り込む extracted_text_array.append(line) line = f.readline() return extracted_text_array path = 'C:\\\\Users\\xxxx\\Desktop\\python' file_name = './' + '123.txt' target = path + file_name block = input() #block = "6-10行を取り込む" x = extract_text_in_file(target, block) n = ''.join(x)  '該当行数' # (1)該当する行数をどうやってカウントすればよいでしょうか? 'データ取得 int型に変換' m = re.findall(r'\d+', n) dat = m[2::4] dat = list(map(int, dat)) print(dat) 'グラフ描画' '描画範囲の指定' 'x = np.arange(x軸の最小値, x軸の最大値, 刻み)' x = np.arange(0, 6, 1) '計算式' y = dat '横軸の変数。縦軸の変数。' plt.plot(x, y,"r-o")   #plt.plot(x,y,”色線点”) plt.xlabel("X-axis")  #x軸の名前 plt.ylabel("Y-axis")  #y軸の名前 '描画実行' plt.show()

  • [VB.NET]WriteAllBytes中の割込み処理について

    [VB.NET]WriteAllBytes中の割込み処理について いつも大変お世話になっています。 早速ですが、 ファイルをFile.WriteAllBytesで フロッピーディスクへ書き込んでいる最中に プログレスバー(またはgifアニメーション)を 動作させたいのですが可能でしょうか? もし可能であればアドバイスお願いいたします。 'タイマー処理 Timer1.Interval = 500 Timer1.Start() 'byte配列のファイルへの書き込み File.WriteAllBytes(name, dest) '<- 固まったように見える... Timer1.Stop() 割込み時の処理には My.Application.DoEvents() を使用しています。

  • 透過GIFについて

    Expression2で絵を描き、ビットマップで保存しました。 その際使用した色はWebSafeカラーです。 それをPaint Shop Pro7Jで開き、透過すると色が抜けてしまうと言うか、荒くなってしまいます。 PSPで描いたものはなりません。 何が原因でしょうか? ぜひぜひ教えてください。 よろしくお願いします。

  • 透過GIFの作り方

    厳密なレイアウトを行う際によく使われる小技として透過GIFを使うのが良いと聞きましたが透過GIFの作り方がわかりません。ソフトはペイントとウェーブアートデザイナーです。 よろしくお願いします

  • 透過gifができません

    調べたのですが分からないので質問させていただきます。 photshop elements2.0を使っているのですが透過できません。 ヘルプを見たのですが、同じようにできません。 ちがう種類のphotoshopのやり方で、やってみたのですが、 イメージ→モード→インデックスカラー→背景を塗る →ファイル→データーの書き出し、としていくのですがデーターの書き出しがクリックできないようになっているので先に進めません。 絵はcorel painterでかいたのを開いています。 うまくgifできないのではなくそこまでも進みません。 どなたかご存知の方がいましたら、宜しくお願いします。

専門家に質問してみよう