Difference in plotting with different matplotlib versions
Разница в построении графиков с разными версиями matplotlib
Мой коллега передал мне скрипт, который используется для сбора данных из базы данных и их построения. Когда я сам использовал скрипт, графики выглядели по-разному, и это связано с версией Matplotlib.
Скрипт, который выполняет построение графиков данных, довольно короткий:
import matplotlib.pyplot as plt import csv import os from dateutil import parser
defplot(outputDir,plotsDir,FS): allfiles = os.listdir(outputDir) flist = [] for f in allfiles: if'csv'in f.lower(): flist.append(f) for f in flist: withopen(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()
Когда я запускаю его с использованием Matplotlib версии 2.1.0, мое изображение выглядит следующим образом: Когда я запускаю его с использованием Matplotlib версии 2.0.2, он выглядит так, как и должен:
Файл, который читает скрипт, выглядит следующим образом:
Кто-нибудь может объяснить мне, что было изменено в Matplotlib, что вызвало это? И, очевидно, я делаю что-то не так с построением графика, что является причиной этого. Кто-нибудь заметил ошибку? Я уже пробовал использовать
values = [float(value) if value.isnumeric() elseNonefor value in values]
Но это не решило проблему. Примечание: Я бы предпочел не использовать какие-либо нестандартные пакеты (например, Pandas), поскольку получить разрешение на установку таких пакетов довольно сложно.
Переведено автоматически
Ответ 1
Данные считываются в виде строк. В matplotlib 2.0 они были автоматически преобразованы в числа с плавающей запятой, чтобы их можно было построить.
В matplotlib 2.1 были введены категориальные графики. Теперь это позволяет выполнять что-то вроде
plt.plot(["apple", "banana", "cherry"], [2,1,3])
Хотя это, конечно, отлично подходит для определенных приложений, это нарушает предыдущий вариант построения строк, которые можно преобразовать в значения с плавающей точкой. Я думаю, что если это нормально, это просто возлагает на пользователя ответственность за выполнение преобразования самостоятельно.
В этом случае вы хотели бы выполнить это преобразование следующим образом
values = [Noneif v is''elsefloat(v) for v in values]
На случай, если у вас уже есть массив numpy: np.array(values).astype(float)