该脚本用于从数据库中收集数据并进行绘制。当我自己使用脚本时,图看起来并不相同,这与Matplotlib的版本有关。
Matplotlib
绘制数据的脚本非常短:
import matplotlib.pyplot as plt import csv import os from dateutil import parser def plot(outputDir,plotsDir,FS): allfiles = os.listdir(outputDir) flist = [] for f in allfiles: if 'csv' in f.lower(): flist.append(f) for f in flist: with open(outputDir + '/' + f, 'rt') as ff: data = list(csv.reader(ff,delimiter=FS)) values = [i[2] for i in data[1::]] values = ['NaN' if v is '' else v for v in values] time = [parser.parse(i[1]) for i in data[1::]] plt.xlabel('Time_[UTC]') plt.plot(time, values) plt.xticks(rotation=40) if os.path.isdir(plotsDir) != 1: os.mkdir(plotsDir, 777) plt.savefig('{}/{}_Data.png'.format(plotsDir, f[:-4]), bbox_inches='tight', dpi=160) plt.clf() outputdir = 'C:/Users/matthijsk/Documents/Test' plotsdir = outputdir + '/plots' fs = ',' plot(outputdir, plotsdir, fs)
当我使用Matplotlib版本2.1.0运行它时,我的图像如下所示: Matplotlib版本2.1.0 当我使用Matplotlib版本2.0.2运行它时,它看起来应该是这样的: Matplotlib版本2.0.2
脚本正在读取的文件如下所示:
stationNo,dtg(UTC),TT_[°C],source_TT,quality_TT 10381,2017-01-01 00:00:00,3.0,ob,na 10381,2017-01-01 01:00:00,3.0,ob,na 10381,2017-01-01 02:00:00,2.4,ob,na 10381,2017-01-01 03:00:00,2.5,ob,na 10381,2017-01-01 04:00:00,2.5,ob,na 10381,2017-01-01 05:00:00,2.3,ob,na 10381,2017-01-01 06:00:00,1.9,ob,na 10381,2017-01-01 07:00:00,1.0,ob,na 10381,2017-01-01 08:00:00,0.1,ob,na 10381,2017-01-01 09:00:00,0.9,ob,na
谁能解释一下导致此问题的Matplotlib中发生了什么变化?显然,我在造成这种情况的绘图上做错了。谁能注意到一个错误?我已经尝试使用
values = [float(value) if value.isnumeric() else None for value in values]
但这并没有解决。注意:我宁愿不使用任何非标准软件包(如Pandas),因为安装此类软件包很容易获得批准。
数据以字符串形式读取。在matplotlib 2.0中,这些被自动转换为浮点数,以便可以对其进行绘制。
在matplotlib 2.1中,引入了分类图。现在这允许类似
plt.plot(["apple", "banana", "cherry"], [2,1,3])
虽然这对于某些应用程序当然是很好的选择,但它打破了以前绘制可转换为浮点数的字符串的选项。我想这还好,它只是赋予用户自己进行转换的责任。
在这种情况下,你可能希望进行如下转换
values = [None if v is '' else float(v) for v in values]
如果你已经有一个numpy数组: np.array(values).astype(float)
np.array(values).astype(float)
通常,可以用来numpy.loadtxt将文件读入float数组。如果文件包含日期,则可以使用转换器来读取带有日期对象的逗号分隔文件,并使用Python进行浮点运算。
numpy.loadtxt
float
读取文本文件的另一种选择是pandas.read_csv。
pandas.read_csv