47

I am trying to plot using matplotlib. The plot showed a problem that the Y axis is not ordered.

Here is the 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()

The CSV data

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

DavidG
  • 24,279
  • 14
  • 89
  • 82
林意專
  • 481
  • 1
  • 4
  • 4

1 Answers1

109

The reason this happens is because your data is being plotted as strings.

The solution is to convert your y axis data to floats. This can be done by simply casting to a float in your list comprehension:

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

I would also suggest to use matplotlib's auto formatting of the x -axis when using dates/times. This will rotate the labels etc to make the graph look better:

plt.gcf().autofmt_xdate()

Your example becomes:

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()

Which gives:

enter image description here

DavidG
  • 24,279
  • 14
  • 89
  • 82
  • 7
    Thank you very much!! It's work now. – 林意專 Jan 02 '18 at 15:07
  • 1
    Using matplotlib for the first time; I have been pulling my hair out for hours trying to figure out why my y-axis was randomly ordering my data set... sure enough I'm pulling data from a CSV, not realizing that I was passing in strings. Thank you for ending my self-inflicted torment. – ZeroKnight May 08 '20 at 08:57
  • 6
    Bingo! `The reason this happens is because your data is being plotted as strings.` this sentence saved the day.. Thanks @DavidG – thepunitsingh Dec 21 '20 at 12:32
  • Yeah I was pulling my hair out trying to solve this issue. Thanks :) – Isaac Padberg Nov 22 '22 at 20:04