我正在制作一个使用枕头热图的动画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种颜色。
我做错了什么?
1条答案
按热度按时间ecbunoof1#
Matplotlib正在制作调色板图像,这导致PIL继续沿着同一轨道前进。通过使用以下命令为PIL提供更大的灵活性:
你会得到: