Постепенно добавляйте и отображайте новые данные в строке matplotlib - PullRequest
0 голосов
/ 08 мая 2020

Вопрос

Как можно добавить данные в существующую строку matplotlib и построить только добавленную часть строки без перерисовки всей строки?

Комментарии

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

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

import matplotlib.pyplot as plt
import numpy as np
import time

# User input
N_chunk = 10000
N_iter = 100

# Prepare data
xx = list(range(N_chunk))
yy = np.random.rand(N_chunk).tolist()

# Prepare plot
fig, ax = plt.subplots()
ax.set_xlim([0,N_chunk])  # observe only the first chunk
line, = ax.plot(xx,yy,'-o')
fig.show()

# Appending data and redraw
dts = []
for i in range(N_iter):
    t0 = time.time()
    xs = xx[-1]+1
    xx.extend(list(range(xs,xs+N_chunk)))
    yy.extend(np.random.rand(N_chunk).tolist())
    line.set_data(xx,yy)
    fig.canvas.draw()
    dt = time.time() - t0
    dts.append(dt)
    plt.pause(1e-10)
plt.close()

# Plot the time spent for every redraw
plt.plot(list(range(N_iter)), dts, '-o')
plt.xlabel('Number of times a portion is added')
plt.ylabel('Redraw time [sec]')
plt.grid()
plt.show()

Redraw time depending on the data size

1 Ответ

0 голосов
/ 10 мая 2020

Вот модифицированная версия вашего кода, которая использует интерактивный режим matplotlib.

import matplotlib.pyplot as plt
import numpy as np
import time

# User input
N_chunk = 10000
N_iter = 100

# Prepare data
xx = np.arange(N_chunk)
yy = np.random.rand(N_chunk)

# Prepare plot
fig, ax = plt.subplots()
#ax.set_xlim([0,N_chunk])  # observe only the first chunk
line = ax.plot(xx,yy,'-o')
plt.ion()   # set interactive mode
fig.show()

# Appending data
dts = []
for i in range(N_iter):
    t0 = time.time()
    xs = xx[-1]+1
    xx=np.arange(xs,xs+N_chunk)
    yy=np.random.rand(N_chunk)
    line=ax.plot(xx,yy,'-o')
    fig.canvas.draw()
    dt = time.time() - t0
    dts.append(dt)
    plt.pause(1e-10)
plt.close()

# Plot the time spent for every redraw
plt.plot(range(N_iter), dts, '-o')
plt.xlabel('Number of times a portion is added')
plt.ylabel('Redraw time [sec]')
plt.grid()
plt.show() 

С раскомментированным ax.set_xlim время перерисовки:

Redraw times

С другой стороны, с ax.set_xlim прокомментировано :

Redrawtimes

Понятно, звоню fig.canvas.draw() редр aws все. В вашем случае, комментируя ax.set_xlim([0,N_chunk]), вы перерисовываете такие вещи, как границы осей, метки и т. Д. c. Вы хотите исследовать блиттинг, как описано в этом SO , чтобы избежать перерисовки объектов осей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...