Automatische Skalierung der Uhrzeit auf der X-Achse bei matplotlib

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Hannibal87
User
Beiträge: 8
Registriert: Freitag 17. Januar 2020, 18:03

Moin,

ich lese Messdaten ein und stelle sie mit Hilfe von matplotlib in tkinter da.
Die Messwerte werden in einem Sekundentakt eingelesen und in eine Liste abgespeichert. Zu dem wird zu jedem Messwert die aktuelle Uhrzeit abgespeichert. Das mache ich mithilfe von " time.strftime("%H:%M:%S") ".
Somit habe ich zu jedem Messwert, die Zeit als String vorliegen. Wenn ich nun die Werte plotten lasse, erscheinen auf der X-Achse die Zeit und zwar zu jedem Messwert, wodurch man die Zeiten nicht mehr lesen kann.
Ich würde gerne unabhängig von der Anzahl der Messwerte nur 10 Zeiten auf der X-Achse anzeigen lassen. Natürlich den Anfangswert, den Endwert und 8 Werte dazwischen zur Orientierung.
Wie könnte man das realisieren?

Beispielcode:

Code: Alles auswählen

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.ticker as ticker
import tkinter as tk
import random
import time
import numpy as np

fig = Figure(figsize = (9, 6), facecolor = "white")
axis = fig.add_subplot(111)
fig.autofmt_xdate()

power_list = list()
time_list = list()
    
for i in range(1, 30):
    power_list.append(random.randint(0, 10))
    time_list.append(time.strftime("%H:%M:%S"))
    time.sleep(1)


gui = tk.Tk()

axis.plot(time_list, power_list, 'r')

canvas = FigureCanvasTkAgg(fig, master = gui)
canvas._tkcanvas.pack(side = tk.TOP, fill = tk.BOTH, expand = 1)

gui.mainloop()
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Es gibt bestimmt eine smartere Variante mit den hauseigenen Möglichkeiten von matplotlib, aber spontan fiel mir nur die Variante unten ein. Ich habe mir eine feste Liste mit Beispielzeiten erzeugt, da ich nicht immer warten wollte.

Code: Alles auswählen

from matplotlib.dates import DateFormatter
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
import random

def get_ticks(x_values):
    ticks = []
    div, rest = divmod(len(x_values)-2, 8)
    if div == 0:
        div = 1
    for item in x_values[::div]:
        ticks.append(item)
    if rest != 0:
        ticks.append(x_values[-1])
    return ticks

time_list =['08:52:32', '08:52:33', '08:52:34', '08:52:35', '08:52:36',
            '08:52:37', '08:52:38', '08:52:39', '08:52:40', '08:52:41',
            '08:52:42', '08:52:43', '08:52:44', '08:52:45', '08:52:46',
            '08:52:47', '08:52:48', '08:52:49', '08:52:50', '08:52:51',
            '08:52:52', '08:52:53', '08:52:54', '08:52:55', '08:52:56',
            '08:52:57', '08:52:58', '08:52:59', '08:53:00', '08:53:01',
            '08:53:02', '08:53:03', '08:53:04', '08:53:05', '08:53:06',
            '08:53:07', '08:53:08', '08:53:09', '08:53:10', '08:53:11',
            '08:53:12', '08:53:13', '08:53:14', '08:53:15', '08:53:16']
datenum_list = mdates.datestr2num(time_list)
power_list = [random.randint(0, 5) for x in time_list]

fig, ax = plt.subplots()
ax.plot(datenum_list, power_list, 'r')
ax.set_xticks(get_ticks(datenum_list))
ax.xaxis.set_major_formatter(DateFormatter('%H:%M:%S'))
fig.autofmt_xdate()
plt.show()
Hannibal87
User
Beiträge: 8
Registriert: Freitag 17. Januar 2020, 18:03

ja, das funktioniert. Vielen Dank!
Antworten