【问题标题】:I cannot get the x-axis on my graph to format correctly我无法正确格式化图表上的 x 轴
【发布时间】:2019-02-14 14:43:16
【问题描述】:

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

编辑:根据要求,我将它变成了一个经过验证的工作示例,我得到的结果是

【问题讨论】:

  • 如果没有minimal reproducible example,我认为人们无法找出您在做什么以及为什么会失败。
  • @ImportanceOfBeingErnest 代码现在给出了我的问题的一个工作示例

标签: python matplotlib dateformatter


【解决方案1】:

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

【讨论】:

  • 我要添加的一件事是图表继续在清除之前绘制先前的点。如果您使用 pi,这可能会导致处理器问题。所以我在 animate 函数中的 clear 和 plot 之间添加了 graph.xaxis.set_major_formatter(mdate.DateFormatter('%H:%M')) graph.xaxis_date() ,以将图形保持在特定的点数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多