Обновление позиций и цветов pyplot.scatter

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

Так что что-то вроде этого уродливого примера работает для одного сюжета:

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]
alpha = [0.2, 0.3, 0.8, 1.0]
c = np.asarray([(0, 0, 1, a) for a in alpha])
s = scatter(x, y, marker='o', color=c, edgecolors=c)

сюжет выше

Но как обновить график, не вызывая повторно s.remove() и scatter()? Предполагается, что совершенно неинтуитивно названные s.set_array и s.set_offsets обновляют цвета и позиции x и y, но я не могу понять, как их использовать с типом данных x, y, alpha, которые у меня есть выше.

(Кроме того, есть ли лучший способ сделать альфу на приведенном выше графике?)


person endolith    schedule 31.05.2014    source источник
comment
@endolith: здесь есть вопрос об обновлении графика в реальном времени: stackoverflow.com/questions/13181118/ может быть, это поможет?   -  person Dair    schedule 31.05.2014
comment
set_array работает, когда вы используете палитру для определения цвета маркеров, а не когда вы устанавливаете цвета вручную. Другое предположение, которое делают эти функции, заключается в том, что количество производителей не меняется (iirc).   -  person tacaswell    schedule 01.06.2014
comment
@tcaswell: Ну, цвета генерируются из данных, а не вручную, поэтому может работать карта цветов с разной альфой. Можете ли вы написать пример того, как использовать пользовательскую палитру и обновлять цвета рассеяния? Количество маркеров не изменится.   -  person endolith    schedule 02.06.2014
comment
matplotlib.org/examples/pylab_examples/custom_cmap.html   -  person tacaswell    schedule 03.06.2014
comment
@tcaswell: я вроде как заставил это работать, но цвета краев другие. Что я делаю неправильно? gist.github.com/endolith/f96d3939ffa5d79c81cc   -  person endolith    schedule 04.06.2014
comment
Извините, недавно был занят, scatter(x, y, c=alpha, cmap=cdict4, linewidth=0) просто избавьтесь от края. (отредактировано, потому что я неправильно запомнил kwargs)   -  person tacaswell    schedule 04.06.2014
comment
Извините за некропост, но я последовал за вами сюда из этого вопроса: stackoverflow.com/questions/15452405/, и мне до сих пор неясно, как именно вы устанавливаете цвета с помощью set_array. Какие-нибудь советы?   -  person Magic_Matt_Man    schedule 24.10.2014
comment
@Magic_Matt_Man Э-э... Я думал, что на этот вопрос был дан ответ, его удалили? У меня где-то есть рабочее решение, постараюсь выложить позже   -  person endolith    schedule 24.10.2014
comment
@endolith Ах, большое спасибо. Я ценю усилия, но в конце концов я также нашел собственное решение без использования set_array. Я обновляю цвета в цикле (анимация с помощью fig.canvas.draw) и обнаружил, что это работает на каждой итерации: n = mpl.colors.Normalize(vmin = min(speedsList), vmax = max(speedsList)); m = mpl.cm.ScalarMappable(norm=n, cmap=mpl.cm.afmhot); scat.set_facecolor(m.to_rgba(speedsList)); scat.set_clim(vmin=min(speedsList), vmax=max(speedsList)); где scat — это точечная диаграмма, а speedsList — это данные, из которых можно получить информацию о цвете.   -  person Magic_Matt_Man    schedule 24.10.2014
comment
@Magic_Matt_Man Это хорошо. Можете ли вы опубликовать это как ответ?   -  person endolith    schedule 24.10.2014


Ответы (1)


Решение, которое я нашел для этого, включает использование Normalize для создания нормализованного списка цветов на основе соответствующих данных, сопоставление его с ScalarMappable и использование этого для установки цвета лица и ограничений c для каждого кадра анимации. С scat дескриптор точечной диаграммы и speedsList предоставляет данные о цвете:

n = mpl.colors.Normalize(vmin = min(speedsList), vmax = max(speedsList))
m = mpl.cm.ScalarMappable(norm=n, cmap=mpl.cm.afmhot)
scat.set_facecolor(m.to_rgba(speedsList))
scat.set_clim(vmin=min(speedsList), vmax=max(speedsList))

Это делает именно то, что я ожидаю.

person Magic_Matt_Man    schedule 24.10.2014