В настоящее время я работаю над приложением Python, которое я начал писать с нуля. Что еще есть:Python-matplotlib живое графическое отображение без перемещения графика (прокрутка)
- Нить, выполняющаяся в фоновом режиме, собирает данные с сервера и записывает их в файл.
- В главном потоке я открывший Matplotlib GUI график, который Участки под Застройку живых данных из этого файла, который я упоминал в пункте 1.
Так вещи супер хорошо, и работая на то, что я объяснил выше. Но когда matplotlib строит данные в реальном времени, график динамически перемещается, когда новые точки добавляются к внутреннему файлу, к которому он относится. Я не уверен, что здесь я хорошо выразил свою проблему. Я хочу сказать, что при обновлении живого графика экран графика буквально перемещается вперед (слева направо), а старый график (старые точки) становится невидимым (по мере перемещения экрана) и теряется. Если я попробую прокрутить влево (используя инструмент прокрутки, заданный средним инструментом matplotlib по умолчанию), тогда просто пробел. Я хочу:
- Экран не должен двигаться.
- Старые точки должны быть видны без прокрутки влево.
- Следует добавлять только новые точки, а старые точки не должны очищаться или перемещаться (скрываться).
Вот мой код:
#import modules
import Tkinter as tk
import MasterWindow
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from threading import Thread
from datetime import *
import matplotlib.dates as dates
from fabfile import connect
import time
from fabric.api import env
LARGE_FONT= ("Verdana", 12)
env.host_string = '[email protected]'
env.password = "nms"
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Graphy-Home", font=LARGE_FONT)
label.pack(pady=10,padx=10)
Command = tk.Label(self, text="Enter Command")
pickCommand = tk.Entry(self)
pickCommand.pack(pady=10)
Command.pack()
button1 = tk.Button(self, text="Submit Command", command=lambda: submit())
button1.pack()
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
def submit():
t1=Thread(target=FileWriter)
t1.start()
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()
print("done")
def FileWriter():
f=open('F:\\home\\WorkSpace\\FIrstPyProject\\TestModules\\sampleText.txt','w',0)
k=0
cmd=pickCommand.get()
while (k < 40):
print("inside while")
p=connect(cmd)
f.write(p.stdout)
f.write('\n')
print("wrote data")
k += 1
def animate(i):
print("inside animate")
pullData = open("sampleText.txt","r").read()
dataArray = pullData.split('\n')
xar = []
yar = []
for eachLine in dataArray:
if len(eachLine)>1:
x,y = eachLine.split(',')
timeX=datetime.strptime(x, "%H:%M:%S")
xar.append(timeX.strftime("%H:%M:%S"))
yar.append(float(y))
#ax1.plot(timeStamps,yar)
plt.plot_date(dates.datestr2num(xar), yar,'b-')
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text="Page Two",
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button2.pack()
app = MasterWindow.MasterWindow(StartPage, PageOne, PageTwo)
app.mainloop()
Просто, чтобы дать головы, функция одушевленным является один работает в основном цикле и функция FileWriter работает в отдельном потоке для сбора данных.
Надеюсь, моя проблема объясняется так, как это можно понять! Если что-то неясно, пожалуйста, дайте мне знать.
не так, поскольку она автоматически весы после каждого шага черчения? Не будет 'plt.set_xlim (min, max)' после 'plt.plot_date()' исправить вашу проблему? Не могли бы вы предоставить фрагмент кода, чтобы мы могли легко воспроизвести ваш сюжет? – jrjc
Вместо 'while (k <40)', а затем увеличивая 'k', просто напишите' для k в диапазоне (40) '. –
@jeanrjc - я предоставил вам весь код в своем вопросе –