web-dev-qa-db-fra.com

Les valeurs de l'axe y Matplotlib ne sont pas ordonnées

J'essaie de tracer en utilisant matplotlib. L'intrigue a montré un problème que l'axe Y n'est pas ordonné.

Voici le code.

# -*- coding: UTF-8 -*-
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
import numpy as np
I020 = [ line.strip('\n').split(",") for line in 
open(r'D:\Users\a0476\Anaconda3\TickData\PV5sdata1.csv')][1:]
Time = [ datetime.datetime.strptime(line[0],"%H%M%S%f") for line in I020 ]
Time1 = [ mdates.date2num(line) for line in Time ]
Solar = [ line[1] for line in I020 ]
order = np.argsort(Time1)
xs = np.array(Time1)[order]
ys = np.array(Solar)[order]
plt.title('Solar data')
plt.xlabel('Time')
plt.ylabel('Solar')
ax.plot_date(xs, ys, 'k-')
hfmt = mdates.DateFormatter('%H:%M:%S')
ax.xaxis.set_major_formatter(hfmt)
plt.show()

Les données CSV

time        solar
7000000     50.35
8000000     41.01
9000000     69.16
10000000    94.5
11000000    111.9
12000000    103
13000000    98.6
14000000    36.45
15000000    34.74
16000000    34.17
17000000    34.6

enter image description here

11
林意專

La raison en est que vos données sont tracées sous forme de chaînes .

La solution consiste à convertir vos données de l'axe y en flottants. Cela peut être fait en lançant simplement un flottant dans votre compréhension de liste:

Solar = [float(line[1]) for line in I020]

Je suggérerais également d'utiliser la mise en forme automatique de matplotlib de l'axe x lors de l'utilisation des dates/heures. Cela fera pivoter les étiquettes, etc. pour améliorer l'apparence du graphique:

plt.gcf().autofmt_xdate()

Votre exemple devient:

I020 = [ line.strip('\n').split(",") for line in open('PV5sdata1.csv')][1:]
Time = [datetime.datetime.strptime(line[0],"%H%M%S%f") for line in I020]
Time1 = [mdates.date2num(line) for line in Time]
Solar = [float(line[1]) for line in I020]

xs = np.array(Time1)  # You don't really need to do this but I've left it in
ys = np.array(Solar)

fig, ax = plt.subplots() # using matplotlib's Object Oriented API

ax.set_title('Solar data')
ax.set_xlabel('Time')
ax.set_ylabel('Solar')
ax.plot_date(xs, ys, 'k-')

hfmt = mdates.DateFormatter('%H:%M:%S')
ax.xaxis.set_major_formatter(hfmt)
plt.gcf().autofmt_xdate()

plt.show()

Qui donne:

enter image description here

33
DavidG