Я не могу заставить ось X на моем графике правильно отформатировать - PullRequest
0 голосов
/ 14 февраля 2019

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

ЧЧ: ММ

Я нашел, как это сделать

xaxis.set_major_formatter(mdate.DateFormatter('%H:%M'))

Но, похоже, это не работает.

from tkinter import *
from tkinter import ttk
import time 
import matplotlib
import threading
matplotlib.use("TkAgg")
import queue
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation
import matplotlib.dates as mdate
from matplotlib import style

root = Tk()

graphXData = queue.Queue()
graphYData = queue.Queue()

def animate(objData):
    graph.clear()
    graph.plot(list(graphXData.queue), list(graphYData.queue))

graphFigure = Figure(figsize=(5,5), dpi=100)
graph = graphFigure.add_subplot(111)
graph.xaxis.set_major_formatter(mdate.DateFormatter('%H:%M'))
graph.xaxis_date()
canvas = FigureCanvasTkAgg(graphFigure, root)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)

for cnt in range (600):
    graphXData.put(matplotlib.dates.epoch2num(time.time()-(600-cnt)))
    graphYData.put(0)

ani = animation.FuncAnimation(graphFigure,animate,interval=1000)

Это дает мне полную очередь из последних 600 секунд как 0. И я добавляю новые точки данных как

graphXData.put(matplotlib.dates.epoch2num(time.time())) 

То, что я получаю, - 0.0XXГде XX - какое-то целое число, которое я не понимаю.

РЕДАКТИРОВАТЬ: В соответствии с просьбой я превратил его в рабочий проверенный пример, и в результате я получаю

enter image description here

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема в том, что вы устанавливаете форматер на оси, но затем вызываете ax.clear().Это очищает оси и удаляет форматер.Таким образом, начиная с первого шага анимации, он будет иметь форматировщик по умолчанию, который показывает числа.

Полезное решение состоит в том, чтобы вообще не очищать оси так, чтобы он сохранял свой форматер.

from tkinter import *
from tkinter import ttk
import time 
import matplotlib
#matplotlib.use("TkAgg")
import queue
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation
import matplotlib.dates as mdate


root = Tk()

graphXData = queue.Queue()
graphYData = queue.Queue()

def animate(objData):
    line.set_data(list(graphXData.queue), list(graphYData.queue))
    ax.relim()
    ax.autoscale_view()

fig = Figure(figsize=(5,5), dpi=100)
ax = fig.add_subplot(111)
ax.xaxis_date()
line, = ax.plot([],[])
ax.xaxis.set_major_formatter(mdate.DateFormatter('%H:%M'))

canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)

for cnt in range (600):
    graphXData.put(matplotlib.dates.epoch2num(time.time()-(600-cnt)))
    graphYData.put(0)

ani = animation.FuncAnimation(fig,animate,interval=1000)

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