Я пытаюсь создать анимированный gif, который принимает график Python в чем-то вроде plt.style.use('dark_background') (т. е. черный фон с белым текстом) и затемняет его до чего-то вроде стиля по умолчанию (т. е. белого фона). с черным текстом).
Вышеупомянутое является результатом выполнения приведенного ниже. Вы увидите, что это не совсем работает, потому что область вокруг области графика и области легенды упорно остается белой. Я пробовал множество вариантов приведенного ниже, но не смог понять.
Я также пытаюсь заставить его не зацикливаться. Повтор = False, похоже, этого не делает. Но это второстепенный вопрос. Главный из них: как заставить фон фигуры менять цвет во время анимации?
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import matplotlib as mpl
# Data for the plot
x1 = np.linspace(1,100)
y1 = np.sin(x1)
#####################################
# STEP 1: FADE TO WHITE - FAILED
#####################################
# Create the figure and axis
fig, ax = plt.subplots()
# Plot the data
line1, = ax.plot(x1, y1, label='sin')
# Set the title and axis labels
ax.set_title('Title')
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
# Add a legend
#ax.legend(loc='right')
legend = ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.subplots_adjust(right=0.79)
# Function to update the plot for the animation
def update1(frame):
if frame>=noFrames:
frame=noFrames-1
startWhite = tuple([(noFrames-frame-1)/(noFrames-1)]*3)
startBlack = tuple([frame/(noFrames-1)]*3)
ax.cla()
# Plot the data
line1, = ax.plot(x1, y1, label='sin')
# Set the title and axis labels
ax.set_title('Title',color=startWhite)
ax.set_xlabel('X Axis',color=startWhite)
ax.set_ylabel('Y Axis',color=startWhite)
# Add a legend
#ax.legend(loc='right')
legend = ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.subplots_adjust(right=0.79)
fig.patch.set_color(None)
fig.patch.set_facecolor(startBlack)
ax.patch.set_facecolor(startBlack)
fig.patch.set_edgecolor(startBlack)
fig.patch.set_color(startBlack)
plt.rcParams['axes.facecolor'] = startBlack
plt.rcParams['axes.edgecolor'] = startBlack
plt.rcParams['axes.labelcolor'] = startWhite
plt.rcParams['axes.titlecolor'] = startWhite
plt.rcParams['legend.facecolor'] = startBlack
plt.rcParams['legend.edgecolor'] = startWhite
plt.rcParams['legend.labelcolor'] = startWhite
plt.rcParams['figure.facecolor'] = startBlack
plt.rcParams['figure.edgecolor'] = startBlack
plt.rcParams['xtick.color'] = startWhite
plt.rcParams['ytick.color'] = startWhite
plt.rcParams['text.color'] = startWhite
fig.canvas.draw_idle()
return fig,
noFrames = 50
# Create the animation
ani = animation.FuncAnimation(fig, update1, frames=range(noFrames*5), blit=False, repeat=False)
ani.event_source.stop() #stop the looping
# Save the animation as a GIF
ani.save('TEST01_fade.gif', writer='pillow', fps=10)
plt.close()
Он остается черным на протяжении всей анимации? Возможно, у вас другой стиль по умолчанию. Если вы включите plt.style.use("dark_background"), он сначала будет черным и останется черным. Проблема в том, что фон не меняет цвет...
Для меня весь фон (как объект Axes, так и объект Fig) сначала черный, а затем переходит в белый.
Я могу подтвердить проблему, используя Python 3.10 и 3.12 и последний пакет matplotlib 3.8.2.
gif поддерживает только 255 различных значений цвета. Они определяются с самого первого изображения в анимации. Обходной путь может заключаться в том, чтобы сначала сохранить анимацию в формате mpeg и преобразовать ее в gif с помощью такой программы, как VLC. Или оставь в mpeg.
Хотели бы вы разместить здесь свою гифку? Я не понимаю, в чем может быть разница.
Я не мог понять, как сделать переход цвета лица фигуры, но обходной путь — использовать одну подфигуру и настроить ее цвет лица. Я также устанавливаю свойства цвета непосредственно для художников, а не использую rcParams, поскольку, по моему мнению, иногда возникает несогласованность в том, когда именно применяются rcParams (например, когда художник создается или когда художник рисуется). Вместо того, чтобы очищать оси и добавлять все заново, я просто сохраняю оригинальных исполнителей, где это возможно. У легенды, похоже, нет необходимых методов set
, поэтому я воссоздаю ее, но легенда все равно всегда заменяет существующую (как и заголовок и метки x, y).
Протестировано с помощью Matplotlib v3.8.2.
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
# Data for the plot
x1 = np.linspace(1,100)
y1 = np.sin(x1)
#######################
# STEP 1: FADE TO WHITE
#######################
# Create the figure, subfigure and axis
fig = plt.figure()
sfig = fig.subfigures()
ax = sfig.add_subplot()
# Plot the data
line1, = ax.plot(x1, y1, label='sin')
# Set the title and axis labels
ax.set_title('Title')
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
# Add a legend
legend = ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.subplots_adjust(right=0.79)
# Function to update the plot for the animation
def update1(frame):
if frame>=noFrames:
frame=noFrames-1
startWhite = tuple([(noFrames-frame-1)/(noFrames-1)]*3)
startBlack = tuple([frame/(noFrames-1)]*3)
# Update background colours
sfig.set_facecolor(startBlack)
ax.set_facecolor(startBlack)
# Set the title and axis labels
ax.set_title('Title',color=startWhite)
ax.set_xlabel('X Axis',color=startWhite)
ax.set_ylabel('Y Axis',color=startWhite)
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.,
facecolor=startBlack, edgecolor=startWhite, labelcolor=startWhite)
# Update tick/label colours
ax.tick_params(color=startWhite, labelcolor=startWhite)
# Update spine colours
ax.spines[:].set_color(startWhite)
noFrames = 50
# Create the animation
ani = animation.FuncAnimation(fig, update1, frames=range(noFrames*5), blit=False, repeat=False)
# Save the animation as a GIF
ani.save('TEST01_fade.gif', writer='pillow', fps=10)
plt.close()
Фон у меня начинается черным на версии 3.7.2.