2016-07-29 5 views
2

x軸のdatetimeオブジェクトを使ってプロットされたグラフがあり、グラフ自体(y値)とx軸の下で色付けできるようにしたいと考えています。私は同様の問題を記述するこの投稿Matplotlib's fill_between doesnt work with plot_date, any alternatives?を見つけましたが、提案された解決策はまったく私を助けませんでした。PyPlotのx軸とグラフの色

マイコード:

import matplotlib.patches as mpatches 
import matplotlib.dates 
import matplotlib.pyplot as plt 
import numpy as np 
import csv 
from tkinter import * 
from datetime import datetime 
from tkinter import ttk 

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

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

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 

dates = matplotlib.dates.date2num(list_of_datetimes) 

fig = plt.figure(1) 
#UZTWC 
ax1 = fig.add_subplot(111) 
plt.plot(dates, UZTWC, '-', color='b', lw=2) 
ax1.fill_between(dates, 0, UZTWC) 
fig.autofmt_xdate() 
plt.title('UZTWC', fontsize=15) 
plt.ylabel('MM', fontsize=10) 
plt.tick_params(axis='both', which='major', labelsize=10) 
plt.tick_params(axis='both', which='minor', labelsize=10) 
plt.grid() 

plt.show() 

この利回り:

Traceback (most recent call last): 
    File "test_color.py", line 36, in <module> 
    ax1.fill_between(dates, 0, UZTWC) 
    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 4608, in fill_between 
    y2 = ma.masked_invalid(self.convert_yunits(y2)) 
    File "C:\Users\rbanks\AppData\Local\Programs\Python\Python35-32\lib\site-packages\numpy\ma\core.py", line 2300, in masked_invalid 
    condition = ~(np.isfinite(a)) 
TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 

問題がfill_betweenはタイプ 'numpy.ndarray' のもので、私の日付を処理することができないが付属しているようです。これを機能させるには、これを別のデータ型に変換する必要がありますか?

編集:より多くのテストの後、list_of_datetimesを使用しようとしても、タイムスタンプにすべてのdatetimeを変換した後でも、この正確なエラーが発生することがわかりました。結局問題。

サンプルデータ:

%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 

私は、Windows 10上でのPython 3.5.0とmatplotlibの1.5.1を使用していると私は私が何を決定するために、まだましWinPython https://sourceforge.net/projects/winpython/を通じて

+0

これは、そこに 'np.nan'sがあるときに表示されるエラーメッセージのようなものだと思います... – bernie

+0

お願いします。助けがあれば、このコードはfill_betweenがなくてもエラーなしで動作します –

+0

問題を示す小さな例を用意してもらえますか?あなたはそれを持っている場合、機密データなしで? – bernie

答えて

1

を私のすべての依存関係を獲得あなたの元のコードで間違っていたが、私はそれがpandasで作業しました:

import pandas as pd, matplotlib.pyplot as plt, matplotlib.dates as mdates 

df = pd.read_csv('/path/to/yourfile.csv') 
df['date'] = df['%YEAR'].astype(str)+'/'+df['MO'].astype(str)+'/'+df['DAY'].astype(str) 
df['date'] = pd.to_datetime(df['date']) 
dates = [date.to_pydatetime() for date in df['date']] 

yyyy_mm_dd_format = mdates.DateFormatter('%Y-%m-%d') 

plt.clf() 
fig = plt.figure(1) 
ax = fig.add_subplot(111) 
ax.plot_date(dates,df[' UZTWC(MM)'],'-',color='b',lw=2) 
ax.fill_between(dates,0,df[' UZTWC(MM)']) 
ax.xaxis.set_major_formatter(yyyy_mm_dd_format) 
ax.set_xlim(min(dates), max(dates)) 
fig.autofmt_xdate() 
plt.show() 

enter image description here

関連する問題