Нет даты и времени X Ось Matplotlib
Я написал этот код, и он работает, но я не могу видеть дату / время на оси X. Я использую matplotlib 2.1.0 и python3. Я создал график для отображения данных в реальном времени от датчика Arduino. Я просто хотел добавить дату и время, используя встроенный модуль datetime в Python3. Код выполняется, но данных по оси X нет. Я хочу знать, почему код не работает. Я указал координаты ax и y, чтобы получить дату из операционной системы. Это график в реальном времени, который перемещается при изменении температуры датчиков. Я видел другой вопрос StackOverFlow о подобной проблеме. У меня уже есть эта строка plt.plot(x, y) в моем коде. Я могу настроить ось X с датой в статическом графике без проблем.
import serial
import time
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from drawnow import *
date_list = []
sensor1 = []
sensor2 = []
sensor3 = []
x = [datetime.datetime.strptime(d, '%Y-%m-%d %H:%M:%S').date() for d in date_list]
y = range(len(x))
arduino_data = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
time.sleep(4)
plt.ion()
counter = 0
def make_figure():
plt.title("Plot")
plt.grid(True)
plt.ylabel("Fahrenheit")
plt.xlabel("Seconds")
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x, y)
plt.gcf().autofmt_xdate()
plt.ylim(50, 85)
plt.plot(sensor1, 'ro-', label="sensor1")
plt.legend(loc='upper left')
plt2 = plt.twinx()
plt.ylim(50, 85)
plt2.plot(sensor2, 'bo-', label="sensor2")
plt.legend(loc='upper center')
plt3 = plt.twinx()
plt.ylim(50, 85)
plt3.plot(sensor3, 'go-', label="sensor3")
plt.legend(loc='upper right')
while True:
while (arduino_data.inWaiting() == 0):
pass
arduino_string = arduino_data.readline().decode('ascii')
data_array = str(arduino_string).split(' ')
time_now = datetime.datetime.today()
date_time = datetime.datetime.strftime(time_now, "%Y-%m-%d %H:%M:%S")
s1 = (str(data_array[1]))
s2 = (str(data_array[2]))
s3 = (str(data_array[3]))
print(date_time, s1, s2, s3)
date_list.append(date_time)
sensor1.append(float(s1))
sensor2.append(float(s2))
sensor3.append(float(s3))
drawnow(make_figure)
plt.pause(.05)
counter += 1
if (counter > 100):
date_list.pop(0)
sensor1.pop(0)
sensor2.pop(0)
sensor3.pop(0)
Вот некоторый рабочий код, который я написал.
import matplotlib
import matplotlib.pyplot as plt
import datetime
y = [2, 4, 12, 8, 9, 13, 14, 14, 18, 20]
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(len(y))]
plt.plot(x, y)
plt.gcf().autofmt_xdate()
plt.show()