Да.
x = np.arange(10)
y = np.random.rand(10)
line, = plt.plot(x,y)
line.set_data(x,np.random.rand(10))
plt.draw()
Однако ваш график становится медленнее, потому что вы расширяете свой кадр данных, и каждая операция добавления, вероятно, копирует этот кадр в память в новое место. По мере увеличения размера фрейма данных эта операция копирования занимает больше времени. Я бы зациклил на индекс и график, что (for ii in range(len(data)): line.set_data(x[:ii], y[:ii])
)
EDIT:
import numpy as np
import matplotlib.pyplot as plt; plt.ion()
import pandas as pd
n = 100
x = np.arange(n)
y = np.random.rand(n)
# I don't get the obsession with pandas...
df = pd.DataFrame(dict(time=x, value=y))
# initialise plot and line
line, = plt.plot(df['time'], df['value'])
# simulate line drawing
for ii in range(len(df)):
line.set_data(df['time'][:ii], df['value'][:ii]) # couldn't be bothered to look up the proper way to index in pd
plt.draw()
plt.pause(0.001)
Эта функция вычисляет значения первого и последнего шага:
static void CalcSteps(int min, int max, int stepSize, out int firstStep, out int lastStep)
{
if (min >= 0)
{
firstStep = (min / stepSize) * stepSize;
}
else
{
firstStep = ((min - stepSize + 1) / stepSize) * stepSize;
}
if (max >= 0)
{
lastStep = ((max + stepSize - 1) / stepSize) * stepSize;
}
else
{
lastStep = (max / stepSize) * stepSize;
}
}
Вы можете рассчитать пределы осей, используя целочисленное округление до более низких и более высоких значений
low = stepsize * (min / stepsize) //integer division needed
high = stepsize * ((max + stepsize - 1) / stepsize)
Пример кода Python возвращает пределы и количество тиков (на один больше, чем счетчик интервалов)
def getminmax(minn, maxx, step):
low = (minn // step)
high = (maxx + step - 1) // step
ticks = high - low + 1
return low * step, high * step, ticks
print(getminmax(213, 4405, 1000))
print(getminmax(-1213,1405, 500))
(0, 5000, 6)
(-1500, 1500, 7)