【发布时间】:2016-07-30 02:04:26
【问题描述】:
我有一个使用日期时间对象绘制 x 轴的图表,我希望能够在图表本身(y 值)和 x 轴下方着色。我发现这篇帖子 Matplotlib's fill_between doesnt work with plot_date, any alternatives? 描述了一个类似的问题,但建议的解决方案对我一点帮助都没有。
我的代码:
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 并将我所有的日期时间转换为时间戳之后,我仍然会遇到这个确切的错误,所以我开始怀疑这是否是类型问题毕竟。
样本数据:
%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/获得了所有依赖项
【问题讨论】:
-
我相信当您在其中有
np.nans 时会收到这种错误消息... -
你能澄清一下吗?如果有帮助,这段没有 fill_between 的代码可以正常工作
-
你能准备一个展示问题的小例子吗?如果有的话,没有任何敏感数据?
-
继续引用 unutbu:“谷歌搜索类型错误:输入类型不支持 ufunc 'isfinite' 表明此错误可能由于 matplotlib 的版本或使用 dtype 的 NumPy 数组时出现object'。而且可能还有其他原因。因此,如果没有可重复的示例,很难知道是什么导致了您的问题。”
-
谢谢@bernie,我已经编辑了我的原始帖子以包含一些示例数据。
标签: python matplotlib