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
.