我无法让图表上的 x 轴正确格式化
I cannot get the x-axis on my graph to format correctly
我正在尝试生成一个实时图表来显示正在读取的数据。
我希望X轴以
的格式显示时间
HH:MM
我找到了怎么做
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()
我正在尝试生成一个实时图表来显示正在读取的数据。 我希望X轴以
的格式显示时间HH:MM
我找到了怎么做
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()