3

I am using matplotlib and pyplot to create some graphs from a CSV file. I can create line graphs no problem, but I am having a lot of trouble creating a bar graph.

I referred to this post matplotlib bar chart with dates among several others that seemed like they should easily accomplish my task, but I can't get it to work with my list of datetimes.

Running the exact code from the above post generates the expected graph, but when I swap our their x and y values for my own from my CSV file:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from datetime import datetime
import csv


columns="YEAR,MONTH,DAY,HOUR,PREC,PET,Q,UZTWC,UZFWC,LZTWC,LZFPC,LZFSC,ADIMC,AET"

data_file="FFANA_000.csv"

list_of_datetimes = []
skipped_header = False
with open(data_file, 'rt') as f:
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
    for row in reader:
        if skipped_header:
            date_string = "%s/%s/%s %s" % (row[0].strip(), row[1].strip(), row[2].strip(), row[3].strip())
            dt = datetime.strptime(date_string, "%Y/%m/%d %H")
            list_of_datetimes.append(dt)
        skipped_header = True        


UZTWC = np.genfromtxt(data_file, delimiter=',', names=columns, usecols=("UZTWC"))

x = list_of_datetimes
y = UZTWC 

ax = plt.subplot(111)
ax.bar(x, y, width=10)
ax.xaxis_date()

plt.show()

Running this gives the error:

Traceback (most recent call last):
File "graph.py", line 151, in <module>
ax.bar(x, y, width=10)
File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\__init__.py", line 1812, in inner
return func(ax, *args, **kwargs)
File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\axes\_axes.py", line 2118, in bar
if h < 0:
TypeError: unorderable types: numpy.ndarray() < int()

When I run the datetime numpy conversion that is necessary for plotting my line graphs:

list_of_datetimes = matplotlib.dates.date2num(list_of_datetimes)

I get the same error.

Could anyone offer some insight?

excerpt from FFANA_000.csv:

%YEAR,MO,DAY,HR,PREC(MM/DT),ET(MM/DT),Q(CMS), UZTWC(MM),UZFWC(MM),LZTWC(MM),LZFPC(MM),LZFSC(MM),ADIMC(MM), ET(MM/DT)
2012,   5,   1,   0,     0.000,     1.250,     0.003,     2.928,     0.000,     3.335,     4.806,     0.000,     6.669,     1.042
2012,   5,   1,   6,     0.000,     1.250,     0.003,     2.449,     0.000,     3.156,     4.798,     0.000,     6.312,     0.987
2012,   5,   1,  12,     0.000,     1.250,     0.003,     2.048,     0.000,     2.970,     4.789,     0.000,     5.940,     0.929
2012,   5,   1,  18,     0.000,     1.250,     0.003,     1.713,     0.000,     2.782,     4.781,     0.000,     5.564,     0.869
2012,   5,   2,   0,     0.000,     1.250,     0.003,     1.433,     0.000,     2.596,     4.772,     0.000,     5.192,     0.809
2012,   5,   2,   6,     0.000,     1.250,     0.003,     1.199,     0.000,     2.414,     4.764,     0.000,     4.829,     0.750
2012,   5,   2,  12,     0.000,     1.250,     0.003,     1.003,     0.000,     2.239,     4.756,     0.000,     4.478,     0.693
2012,   5,   2,  18,     0.000,     1.250,     0.003,     0.839,     0.000,     2.072,     4.747,     0.000,     4.144,     0.638
2012,   5,   3,   0,     0.000,     1.250,     0.003,     0.702,     
Community
  • 1
  • 1
Randy Banks
  • 371
  • 1
  • 7
  • 25

1 Answers1

0

I could not fully reproduce your problem with your data and code. I get

> UZTWC = np.genfromtxt(data_file, delimiter=';', names=columns,
> usecols=("UZTWC"))   File
> "C:\Python34-64bit\lib\site-packages\numpy\lib\npyio.py", line 1870,
> in genfromtxt
>     output = np.array(data, dtype) ValueError: could not convert string to float: b'UZTWC(MM)'

But try changing UZTWC = np.genfromtxt(...) to

UZTWC = np.genfromtxt(data_file, delimiter=',', usecols=(7), skip_header=1)

and you should get a graph. The problem is that for some reason your numpy array is a made of strings and not floats.

Maximilian Peters
  • 30,348
  • 12
  • 86
  • 99