Нарисуйте блок цвета сверху фигуры, чтобы создать следы в питоне - PullRequest
2 голосов
/ 22 февраля 2011

У меня есть набор данных, которые я строю, используя pylab, который меняется со временем.

Я могу сохранить каждый кадр в формате .png и соединить их, используя iMovie, но я хочу добавить следы на графики, чтобы проиллюстрировать положение в предыдущие моменты времени.

Один из способов, которым я думал, что это можно сделать, это установить plt.hold (True) на фигуре, а затем построить блок белого цвета размером с оси с (значением прозрачности) alpha <1 поверх данных в каждый новый момент времени. </p>

Кто-нибудь знает, как я могу это сделать? axisbg, похоже, не работает.

Большое спасибо,

Hannah

1 Ответ

2 голосов
/ 18 апреля 2011

Альтернативный способ получения следов затухания на последовательности графиков заключается в изменении альфа-значений отображаемых элементов с использованием метода .set_alpha(), если он доступен для конкретного метода построения, который вы используете.

Вы можете сделать это, добавив выходные данные конкретной функции печати, которую вы используете (т. Е. «Дескриптор» для графика), в список. Затем перед каждым новым графиком вы можете найти и уменьшить альфа-значения каждого существующего элемента в этом списке.

В следующем примере элементы, альфа-значения которых выходят за пределы определенной точки, удаляются из графика с помощью .remove(), а их дескриптор затем удаляется из списка.

import pylab as pl

#Set a decay constant; create a list to store plot handles; create figure.
DECAY = 2.0
plot_handles = []
pl.figure()

#Specific to this example: store x values for plotting sinusoid function
x_axis=pl.linspace( 0 , 2 * pl.pi , 100 )

#Specific to this example: cycle 50 times through 16 different sinusoid
frame_counter = 0
for phase in pl.linspace( 0 , 2 * pl.pi * 50 , 16 * 50 ):

    #Reduce alpha for each old item, and remove
    for handle in plot_handles:
        alpha = handle.get_alpha()
        if alpha / DECAY > 0.01 :
          handle.set_alpha( alpha / DECAY )
        else:
          handle.remove()
          plot_handles.remove( handle )

    #Add new output of calling plot function to list of handles
    plot_handles += pl.plot( pl.sin( x_axis + phase ) , 'bo' )

    #Redraw figure
    pl.draw()

    #Save image
    pl.savefig( 'frame_' + str( frame_counter ).zfill( 8 ) + '.png' )
    frame_counter += 1
...