Изменение цветовой схемы в анимированном GIF-файле matplotlib

Я пытаюсь создать анимированный 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()

Фон у меня начинается черным на версии 3.7.2.

jared 30.04.2024 01:06

Он остается черным на протяжении всей анимации? Возможно, у вас другой стиль по умолчанию. Если вы включите plt.style.use("dark_background"), он сначала будет черным и останется черным. Проблема в том, что фон не меняет цвет...

Dr Xorile 30.04.2024 01:13

Для меня весь фон (как объект Axes, так и объект Fig) сначала черный, а затем переходит в белый.

jared 30.04.2024 01:29

Я могу подтвердить проблему, используя Python 3.10 и 3.12 и последний пакет matplotlib 3.8.2.

oOosys 30.04.2024 03:12

gif поддерживает только 255 различных значений цвета. Они определяются с самого первого изображения в анимации. Обходной путь может заключаться в том, чтобы сначала сохранить анимацию в формате mpeg и преобразовать ее в gif с помощью такой программы, как VLC. Или оставь в mpeg.

JohanC 30.04.2024 11:39

Хотели бы вы разместить здесь свою гифку? Я не понимаю, в чем может быть разница.

Dr Xorile 30.04.2024 20:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не мог понять, как сделать переход цвета лица фигуры, но обходной путь — использовать одну подфигуру и настроить ее цвет лица. Я также устанавливаю свойства цвета непосредственно для художников, а не использую 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()

Другие вопросы по теме

Похожие вопросы

Как передать значения при преобразовании рекурсивной функции в итеративную со стеком и циклом while
Создайте манекен для отсутствующих значений переменной в Python
Многопроцессорная обработка Python: AttributeError: невозможно получить атрибут <имя_функции> в модуле
Интеграция RFE с GBM для выбора функций и настройки гиперпараметров
Выбор параметра в зависимости от другого выбранного родительского параметра на той же странице
Как я могу улучшить RMSE при оценке цены моего автомобиля?
Лучший/самый чистый способ структурировать проверку ошибок в динамически выделяемых переменных
Как объединить/объединить две строки после того, как длинные столбцы были неправильно прочитаны в отдельные строки?
Деконструкция кортежа при использовании сортировки с лямбда-функцией по ключу
Поиск лиц с помощью Skimage.measure.marching_cubes возвращает странное смещение, основанное на ограничениях сетки