2017-11-07 2 views
2

Ein Kollege von mir reichte mir ein Skript, mit dem Daten aus einer Datenbank gesammelt und geplottet werden. Wenn ich das Skript selbst benutzte, sehen die Diagramme nicht gleich aus, und es hat mit der Version von Matplotlib zu tun.Unterschied beim Plotten mit verschiedenen Matplotlib-Versionen

Das Skript, das die Aufzeichnung der Daten tut, ist recht kurz:

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) 

Wenn ich es mit Matplotlib Version 2.1.0 laufen, mein Bild sieht wie folgt aus: Matplotlib version 2.1.0 Wenn ich laufe es Matplotlib mit 2.0.2 Version, sieht es so, wie es soll: Matplotlib version 2.0.2

die Datei das Skript sieht wie folgt liest:

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 

Kann mir jemand erklären, was in Matplotlib geändert wurde, was das verursacht hat? Und anscheinend mache ich etwas falsch mit der Verschwörung, die das verursacht. Kann jemand einen Fehler bemerken? Ich habe bereits versucht

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

Aber das war es nicht zu lösen. Hinweis: Ich würde lieber keine Nicht-Standard-Pakete (wie Pandas) verwenden, da es ziemlich mühsam ist, die Installation solcher Pakete zu genehmigen.

Antwort

3

Die Daten werden als Strings eingelesen. In Matplotlib 2.0 wurden diese automatisch in Fließkommazahlen umgewandelt, so dass sie geplottet werden können.

In Matplotlib 2.1, categorical plots have been introduced. Dies ermöglicht es jetzt so etwas wie

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

Während dies natürlich toll für bestimmte Anwendungen ist es die vorherige Option bricht Ketten darstellen, die an Schwimmern konvertierbar sind. Ich denke, wenn es in Ordnung ist, gibt es nur den Benutzer die Verantwortung, die Konvertierung selbst zu tun.

In diesem Fall würden Sie diese Umwandlung wie

values = [None if v is '' else float(v) for v in values] 
tun wollen
Verwandte Themen