#python #plot #wxmpl
#python #график #wxmpl
Вопрос:
Ниже у меня есть список времени для построения графика:
time_list = [63158,63159,63200,63201,63202]
Но я хочу, чтобы это было графически:
time_list = [6:31:58,6:31:59,6:32:00,6:32:01,6:32:02]
И между 63159 и 63200 не следует вести себя так, как будто среди них есть 40 чисел.
Я могу использовать это с библиотекой matplotlib, но для моих целей wxmpl лучше, чем это.
Итак, мой вопрос в том, как я могу использовать форматирование времени с любой библиотекой графиков, кроме matplotlib?
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
from wxmplot import PlotPanel
import wx
x=[]
class MyFrame1 ( wx.Frame ):
def __init__( self, parent, **kws ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 595,476 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL, **kws )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
bSizer2 = wx.BoxSizer( wx.VERTICAL )
gSizer1 = wx.GridSizer( 0, 0, 0, 0 )
###############################
self.plotpanel = PlotPanel(self)
###############################
self.toggleBtn4 = wx.ToggleButton( self, wx.ID_ANY, u"Plot", wx.DefaultPosition, wx.DefaultSize, 0 )
gSizer1.Add( self.toggleBtn4, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
bSizer2.Add( gSizer1, 1, wx.EXPAND, 5 )
bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 )
bSizer3 = wx.BoxSizer( wx.VERTICAL )
bSizer3.Add(self.plotpanel, 1, wx.ALL|wx.EXPAND, 0 )
bSizer1.Add( bSizer3, 3, wx.EXPAND, 5 )
self.SetSizer( bSizer1 )
#bSizer1.Fit(self)
self.Centre( wx.BOTH )
# Connect Events
self.toggleBtn4.Bind( wx.EVT_TOGGLEBUTTON, self.plot )
def plot( self, event ):
time_list = [63150,63151,63152,63153,63154,63155,63156,63157,63158,63159,63200,63201,63202,63203,63204,63205,63206,63207,63208,63209,63210]
y = [100,101,105,124,119,134,89,147,98,75,52,150,143,156,99,13,54,68,100,85,87]
obj = event.GetEventObject()
isPressed = obj.GetValue()
if isPressed:
for i in time_list:
hour = i//10000
minute = (i//100)%100
second = i%100
time_new = hour*3600 minute*60 second
x.append(time_new)
print("i : ",i)
print("zaman : ",time_new)
time4 = time.strftime('%H:%M:%S', time.gmtime(time_new))
print("time : ",time4,"n")
self.plotpanel.plot(x, y)
else:
self.Destroy()
if __name__ == "__main__":
app = wx.App(False)
f = MyFrame1(None)
f.Show(True)
app.MainLoop()
Ответ №1:
В настоящее время wxmplot.PlotPanel.plot()
(и .oplot()
) поддерживает автоматическое преобразование xdata
в значения даты и времени только при использовании plot(xdata, ydata, use_dates=True)
и только с xdata
временными метками Unix.
То есть use_dates=True
делает
from datetime import datetime
from matplotlib import dates
...
def plot(xdata, ydata, ..., use_dates=False, ....):
...
if use_dates:
xdata = dates.date2num([datetime.fromtimestamp(i) for i in xdata])
Итак, я думаю, вам придется преобразовать вашу пользовательскую кодировку временных данных в более стандартное представление времени. Я думаю, у вас есть два варианта:
-
преобразуйте ваши
time_list
данные во временные метки (секунды с момента эпохи) и используйтеuse_dates=True
. -
преобразуйте свои
time_list
данные в экземплярmatplotlib.dates
, возможно, используяdatetime
в качестве промежуточной формы и используйтеuse_dates=False
.
Комментарии:
1. @M Newville, сэр после изменения моего типа графика на
plotpanel.update_line()
, я применилuse_dates
к нему, но он выдал ошибку:update_line() got an unexpected keyword argument 'use_dates'
2. Ваш вопрос был не о
update_line()
, а оplot()
.update_line()
не поддерживаетuse_dates
, поскольку ожидает, что вы контролируетеxdata
иydata
и хотите обновить трассировку графика как можно быстрее. Итак, как намекает приведенный выше ответ, вы должны выполнить преобразованиеdates.date2num()
самостоятельно перед отправкой данных вupdate_line()
.
Ответ №2:
У меня аналогичная проблема: я использую wxmplot.interactive.график, который имеет этот параметр use_dates
. Я попытался преобразовать свои данные в временную метку Unix и поместить use_dates = True
вот так:
dt1 = dt.datetime(int(Year), int(Month), int(Day), int(hour),
int(minute),int(second))
data_converted = time.mktime(dt1.timetuple())
с годом, месяцем, Днем, часом, минутой, секундой — это строки.
Здесь вы можете найти результат, когда я создаю картинку, с моими датами по оси x.
Картинка
Когда я вижу результат, я вижу, что данные похожи на временную метку, поэтому не очень полезны. Можете ли вы сказать мне , правильно ли я преобразовал свои данные ? Я хотел бы иметь данные для оси x, такие как «Y: M: D: H: M: S».
Комментарии:
1. Я также пробовал этот метод, преобразовывал данные в экземпляр matplotlib.dates, возможно, используя datetime в качестве промежуточной формы и используя use_dates=False , но тоже с плохим результатом. Я вижу, что эти значения отличаются для оси x от первого решения.