2016-08-23 2 views
2

Я написал простой скрипт на основе кода от herematplotlib - более быстрая частота кадров?

Мне просто нужно отображать точки, не нужно линий.

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

import matplotlib 
matplotlib.use('TKAgg') 

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.colors import cnames 
from matplotlib import animation 

NbOfObjects = 3 

fig = plt.figure() 

ax = fig.add_axes([0, 0, 1, 1], projection='3d') 
ax.axis('on') 

ax.set_xlim((-1.5, 1.5)) 
ax.set_ylim((-1.5, 1.5)) 
ax.set_zlim((0, 1.5)) 

ax.set_xlabel('x axis') 
ax.set_ylabel('y axis') 
ax.set_zlabel('z axis') 

# set point-of-view: specified by (altitude degrees, azimuth degrees) 
ax.view_init(30, 30) 

# choose a different color for each trajectory 
colors = plt.cm.jet(np.linspace(0, 1, NbOfObjects)) 

# set up points 
pts = sum([ax.plot([], [], [], 'o', c=c) 
      for c in colors], []) 

data = [[[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 0.0, 0.0], [0.0, -1.0, 1.0], [-1.0, 1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[1.0, 1.0, 0.0], [0.0, 0.0, 1.0], [-1.0, -1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]], 
     [[0.0, 0.0, 0.0], [-1.0, -1.0, 1.0], [1.0, 1.0, 1.0]]] 


# initialization function: plot the background of each frame 
def init(): 
    for pt in pts: 
     pt.set_data([], []) 
     pt.set_3d_properties([]) 

    return pts 


def animate(i): 

    print "i: ", i 

    for pt, positon in zip (pts, data[i]): 

     x = positon[0] 
     y = positon[1] 
     z = positon[2] 

     pt.set_data(x, y) 
     pt.set_3d_properties(z) 

    fig.canvas.draw() 

    return pts 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, frames=len(data), blit=True, repeat=False) 

plt.show() 
  1. Как отображение кадров на экране, относятся к параметру «интервал» в animation.FuncAnimation? (Я не могу заставить его отображать 50 кадров менее чем за 5 секунд)

  2. Этот дизайн лучше всего подходит для большого количества точек (10+) с потенциалом 30 кадров в секунду в течение длительного времени? («данные» были бы довольно большими в течение 1 часа).

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

Спасибо.

+0

Возможно, вам лучше всего построить все точки в одном вызове, передав массив цветов как аргумент 'c =', а не объект. Хотя я думаю, что только с тремя точками в каждом кадре, это, вероятно, мало чем отличается. – Eric

+0

Я думаю, что 'blit = True' делает' fig.canvas.draw() 'unecessary – Eric

+0

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

ответ

1
  1. От the documentation:

    kwargs include repeat , repeat_delay , and interval : interval draws a new frame every interval milliseconds. repeat controls whether the animation should repeat when the sequence of frames is completed. repeat_delay optionally adds a delay in milliseconds before repeating the animation.

    Однако это только устанавливает верхнюю границу частоты кадров - если это занимает слишком много времени, чтобы сделать кадр, то вы увидите более медленную частоту кадров

  2. Если у вас есть большее количество точек, вы хотите сделать что-то вроде:

    data = np.array(data) 
    
    # in init, get a single mpl_toolkits.mplot3d.art3d.Line3D object 
    # the comma is important! 
    pts, = ax.plot([], [], [], 'o', c=colors) 
    
    # in update() 
    pts.set_data(data[i,:,0], data[i,:,1]) 
    pts.set_3d_properties(data[i,:,2]) 
    

    Чтобы исключить цикл for

+0

2/Теперь я получаю значение запятой (назначьте первый элемент списка на pts). Во всяком случае, я думаю, что получаю вашу идею ... Я изменил 2 функции в соответствии с вашим предложением, однако в update() теперь я получаю **. Объект AttributeError: 'list' не имеет атрибута 'set_data' **, который имеет смысл потому что pts - это список. Я не уверен, как это сделать, не используя (ноте) цикл «для». Я попытаюсь найти некоторую информацию в документе. Thx. – lolo

+0

'pts' - это объект Line3D на моя машина ... Или первая строка этого комментария перечеркнула остальную ее часть> – Eric

+0

@lolo: Разница в каком направлении? – Eric