#python #python-2.7 #python-3.x #matplotlib #plot
#python #python-2.7 #python-3.x #matplotlib #график
Вопрос:
Я использую matplotlib для периодического отображения данных, сохраненных в файле csv, теперь данные отображаются хорошо, но ось времени практически не перемещается, фактически скрипт пытается отобразить все данные, хранящиеся в этом файле, я хочу видеть только последние данные и иметь возможность прокручивать по горизонтали, чтобы увидеть более старыеданные это часть скрипта :
style.use('grayscale')
fig = plt.figure()
ax0= fig.add_subplot(511)
def animate(i):
graph_data = open('filelocation','r').read()
lines = graph_data.split('n')
xs = []
ys = []
for line in lines :
if len(line)>1:
time0 , quantity0 = line.split (',')
xs.append(dt.datetime.strptime(time0,'%H:%M:%S.%f'))
ys.append(quantity0)
ax0.clear()
ax0.plot(xs,ys)
xs = matplotlib.dates.date2num(xs)
hfmt = matplotlib.dates.DateFormatter('%H:%M:%S')
ax0.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
ax0.set_ylabel('risk')
ax0.xaxis.set_major_formatter(hfmt)
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.ticklabel_format(style='sci',axis ='y' , scilimits = (0,0))
plt.show()
plt.clear()
Комментарии:
1. Я не могу воссоздать проблему с этим кодом, но вы пробовали использовать
ax0.set_xlim
для перемещения оси x, чтобы отобразить окно данных, которые вы хотите просмотреть?2. Нет, это заставит его автоматически перемещаться слева направо по мере поступления данных?
3. ОК. Я не совсем понимаю, что вы пытаетесь сделать тогда. Вы хотите сделать его интерактивным? Есть ли шанс, что вы можете создать какие-то поддельные данные, чтобы ваш приведенный выше пример был полностью воспроизводимым?
4. в этом видео показано все, первые 7 секунд показывают, как данные продолжают поступать справа, в то время как они не поступают с левой стороны, это точно мой случай и проблема, остальная часть видео (после 7-й секунды) показывает, как я хочу, чтобы это было.
Ответ №1:
Из этого видео похоже, что вы хотите что-то вроде следующего — я все еще вижу окно прокрутки в видео, которое вы опубликовали, поэтому я все еще немного смущен тем, что вы хотите. Это использует fig.canvas.draw
, но есть и другие варианты, использующие модуль анимации matplotlib (вы не указали, что он должен использовать этот модуль).
import numpy as np, time
from matplotlib import pyplot as plt
import matplotlib
matplotlib.interactive(True)
rest_time = 0.001
data_stream = np.random.randn(200)
# Define the width of the viewing window (xaxis limits),
# and the number of points to be displayed until a scrolling window starts
window_width = 40
n = 60
fig, ax = plt.subplots()
plotted_data, = ax.plot([], [], 'bo-', lw = 1.5)
x = []
y = []
ax.set_xlim([0, window_width])
ax.set_ylim([-4, 4])
for t, d in enumerate(data_stream):
x.append(t)
y.append(d)
plotted_data.set_xdata(x)
plotted_data.set_ydata(y)
if t > window_width:
ax.set_xlim([0, t])
if len(x) > n:
ax.set_xlim([t-n, t])
time.sleep(rest_time)
fig.canvas.draw()
Комментарии:
1. Хорошо, это может быть решением, в моем случае у меня есть csv-файл, содержащий два столбца Time, value … Как это решение может работать для меня, поскольку у меня есть время по оси x.. Если вы хотите, я могу загрузить пример файла, из которого я беру данные
2. Измените цикл for на
for t, d in zip(times, values):
wheretimes
— это массив времен, которые вы хотите отобразить (столбец Time вашего набора данных), иvalues
это массив значений, которые вы хотите отобразить.