matplotlib 为什么在动画gif中没有使用完整的调色板?

h4cxqtbf  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在制作一个使用枕头热图的动画gif。由于有很多不同的值,每帧只能有256种颜色,我希望枕头会给我一个不同的调色板每帧。但它似乎没有使用大多数可用的颜色。下面是一个MWE:

from PIL import Image
import seaborn as sns
import io
import matplotlib.pyplot as plt
import scipy
import math
import numpy as np
import imageio

vmin = 0
vmax = 0.4
images = []
for i in range(3):
    mu = 0
    variance = i+0.1
    sigma = math.sqrt(variance)
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 400)
    row = scipy.stats.norm.pdf(x, mu, sigma)
    matrix = []
    for i in range(400):
        matrix.append(row)
    cmap = "viridis"
    hmap = sns.heatmap(matrix, vmin=vmin, vmax=vmax, cmap=cmap, cbar=False)
    hmap.set_xticks(range(0, 101, 4))
    buffer = io.BytesIO()
    plt.savefig(buffer, format='png')
    buffer.seek(0)
    images.append(Image.open(buffer))
    plt.clf()

images[0].save("out.gif", save_all=True, duration=1000,  loop=1, append_images=images[1:])

生成的动画gif是:

您可以看到后面的帧使用的颜色少于256种。如果我看调色板

identify -verbose  out.gif|grep Colors

我得到这些:

  • 对于第一帧:颜色:46
  • 对于第二帧:颜色:28
  • 对于第三帧:颜色:19

如果我保存png,我们可以看到第三帧,例如,有超过19种颜色。

我做错了什么?

ecbunoof

ecbunoof1#

Matplotlib正在制作调色板图像,这导致PIL继续沿着同一轨道前进。通过使用以下命令为PIL提供更大的灵活性:

images.append(Image.open(buffer).convert('RGB')

你会得到:

相关问题