python matplotlib

python - Diferencia en el trazado con diferentes versiones de matplotlib



(1)

Un colega mío me entregó un script que se utiliza para recopilar datos de una base de datos y trazarlo. Cuando utilicé el script yo mismo, las tramas no se ven iguales, y tiene que ver con la versión de Matplotlib.

El script que traza los datos es bastante corto:

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)

Cuando lo ejecuto con Matplotlib versión 2.1.0, mi imagen se ve así: Cuando lo ejecuto usando Matplotlib versión 2.0.2, se ve como se supone que debe:

El archivo que lee el script se ve así:

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

¿Alguien puede explicarme qué cambió en Matplotlib que causó esto? Y aparentemente estoy haciendo algo mal con la trama que está causando esto. ¿Alguien puede notar un error? Ya he intentado usar

values = [float(value) if value.isnumeric() else None for value in values]

Pero eso no lo resolvió. Nota: Prefiero no usar ningún paquete no estándar (como Pandas) ya que es bastante complicado obtener la aprobación para instalar dichos paquetes.


Los datos se leen como cadenas. En matplotlib 2.0, esos se convirtieron automáticamente a números de coma flotante para que se puedan trazar.

En matplotlib 2.1, se han introducido gráficos categóricos . Esto ahora permite algo como

plt.plot(["apple", "banana", "cherry"], [2,1,3])

Si bien esto es, por supuesto, excelente para ciertas aplicaciones, rompe la opción anterior de trazar cadenas que se pueden convertir en flotantes. Supongo que si está bien, solo le da al usuario la responsabilidad de hacer la conversión él mismo.

En este caso, desearía hacer esta conversión como

values = [None if v is '''' else float(v) for v in values]

En caso de que ya tenga una matriz np.array(values).astype(float) : np.array(values).astype(float)

En general, se puede usar numpy.loadtxt para leer archivos en matrices flotantes. Si el archivo contiene fechas, sería posible utilizar un convertidor como al leer un archivo delimitado por comas con un objeto de fecha y un flotador con Python .

Otra opción para leer en archivos de texto sería pandas.read_csv .