Python 我无法使图形上的x轴格式正确

Python 我无法使图形上的x轴格式正确,python,matplotlib,dateformatter,Python,Matplotlib,Dateformatter,我试图生成一个实时图形,在读取数据时显示数据。 我希望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 matplo

我试图生成一个实时图形,在读取数据时显示数据。 我希望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是一些我不理解的整数

编辑:根据要求,我将其制作成一个工作验证示例,结果是


问题是您将格式化程序设置为轴,但随后调用
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()

我认为如果没有一个简单的例子,你就无法找出你在做什么以及为什么失败。@ImportantanceOfBeingernest代码现在给出了一个我的问题的工作示例。我要补充的一点是,在清除之前,图形继续绘制前面的点。如果运行pi,这可能会导致处理器出现问题。因此,我在animate函数中的clear和plot之间添加了graph.xaxis.set_major_formatter(mdate.DateFormatter(“%H:%M”))graph.xaxis_date(),以将图形保持在特定的点数