Как анимировать текст в 3D Scatter Plot? - PullRequest
0 голосов
/ 23 декабря 2018

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

Прямо сейчас текстовые метки do следуют за точками данных, как я хочу, но они сохраняются в каждом кадре;текст не исчезает из последнего обновления анимации.Смотрите изображение ниже.Сами точки данных перемещаются просто отлично.

2 Вопросы, ответы на которые могут мне помочь>

  1. Есть ли способ очистки текста без очистки точек данных?
  2. Моя реализация кажется немного неуклюжей.Есть ли скрытая функция, похожая на _offset3d , которая работает для текстовых объектов.

Вот графическая функция :

def graph(data, update_cnt):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    dots = ax.scatter(data[0][0][:], data[1][0][:], data[2][0][:])
    dot_txt = nmp.ones(nmp.size(data,2), dtype=str)

    for n in range(0,nmp.size(data, 2)):
        dot_txt[n] = ax.text(data[0][0][n], data[1][0][n], data[2][0][n],'%s'%(n))

    ani = animation.FuncAnimation(fig, update, update_cnt, fargs=(dots, data, dot_txt, ax), interval=300)

    plt.show()

и функция обновления анимации :

def update(num, dots, data, dot_txt, ax):
    y = data[0][num][:]
    x = data[1][num][:]
    z = data[2][num][:]

    dots._offsets3d = (x, y, z)
    #dot_txt._something_to_update_text_here()

    dot_txt = nmp.ones(nmp.size(data,2), dtype=str)
    for n in range(0,nmp.size(data, 2)):
        dot_txt[n] = ax.text(data[1][num][n], data[0][num][n], data[2][num][n],'%s'%(n))

и текущий график вывода : 3D scatter plot text animation attempt

1 Ответ

0 голосов
/ 04 января 2019

Я нашел решение.

Я думаю, что важно отметить, что я не мог использовать более распространенные решения для трехмерных анимированных графиков рассеяния, потому что мне нужны разные стили маркеров для разных точек.Это заставляет меня итеративно строить каждую точку разброса, а не передавать список в функцию обновления.Однако при этом проблема анимации текста решается красиво.

frame_list содержит координаты x, y, z и стиль для каждой точки данных в каждом кадре.

def graph(frame_list):

  fig = plt.figure()
  ax = fig.add_subplot(111, projection='3d')

  frame_cnt = len(frame_list)

  ani = animation.FuncAnimation(fig, update_graph, frame_cnt,
        fargs=(frame_list, ax, frame_cnt), interval=600)

  plt.show()

Самым большим вкладом в успех этого является вызов ax.clear () перед каждым кадром.

def update_graph(f, frame_list, ax, cnt):

ax.clear()
f = nmp.mod(f, cnt)
frame = frame_list[f]

for n in range(len(frame.marker)):
    x, y, z, s, c, m, name = frame.get_params(n)

    ax.scatter(x, y, z, s=s, c=c, marker=m)
    ax.text(x, y, z, '%s'%(name))

Функция get_params возвращает всесоответствующих данных для этого кадра.

...