Когда я был ВУЗ(овцем) нам на первом курсе на лабораторных работах по Физике часто приходилось строить графики. Причем рисовать их приходилось от руки на миллиметровой бумаге. Выглядело это кустарно. С первого раза начертить график не получалось. Приходилось стирать ластиком. Миллиметровая шкала стиралась. На графике появлялись белые облака.
Тогда в 200x просто не хватало навыков программирования чтобы отрисовать эти графики на PC. Сейчас же построить график можно с легкостью на LapTop(е). Причем существует целая куча разных способов построить график на PC. Это можно делать в Google Spreadsheets, MatLab, MathCAD, GNU Octave, GNU Plot, MS Excel, GraphViz, Asymptote.
Попробуем еще построить график на Python при помощи программного компонента matplotlib.
Постановка задачи:
Есть файл LiLog.csv. Вот несколько его строчек:
14, 1.833, 22.25, 22:43:09, 9/7/2023, 1517544445
15, 0.833, 22.25, 22:43:29, 9/7/2023, 1517544465
16, 0.000, 22.25, 22:43:49, 9/7/2023, 1517544485
17, 0.833, 22.25, 22:44:09, 9/7/2023, 1517544505
Надо построить 2D график, где по оси Х n-ный столбец, а по оси Y - k-тый столбец из текстового файла.
Что надо из софтвера?
№ |
Программа |
Назначение |
1 |
Python.exe |
Интерпретатор язык программирования Python |
2 |
matplotlib |
Модуль для визуализации |
3 |
csv |
Модуль синтаксического разбора *.CSV файлов |
4 |
NotePad++.exe |
Текстовый редактор для написания Python скрипта и редактирования файла с исходными данными для графика |
Решение
Вот этот скрипт берет *.csv файл и строит график по 4му и 2му столбцу.
import matplotlib.pyplot as plt
import csv
X = []
Y = []
with open('LiLog.csv', 'r') as datafile:
plotting = csv.reader(datafile, delimiter=';')
for ROWS in plotting:
X.append(float(ROWS[5]))
Y.append(float(ROWS[1]))
plt.plot(X, Y)
plt.title('Line Graph using CSV')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
Что происходит в этом скрипте. Программа создает 2 списка: X Y. В список X помещает числа из 4го столбца в список Y помещает данные из второго столбца. Затем программа отрисовывает график по этим значениям на канве в отдельном окне.
Получился вот такой график
Также в график можно добавить еще один график, пояснения (легенду).
import matplotlib.pyplot as plt
import csv
X = []
Y = []
with open('LiLog.csv', 'r') as datafile:
plotting = csv.reader(datafile, delimiter=';')
for ROWS in plotting:
X.append(float(ROWS[5]))
#X.append('{} {}'.format(ROWS[3], ROWS[4]))
Y.append(float(ROWS[1]))
print ('X {} Nums'.format(len(X)))
print ('Y {} Nums'.format(len(Y)))
threshold=63.0
T=[threshold]*len(Y)
print ('Type X {} '.format(type(X)))
print ('Type Y {} '.format(type(Y)))
print ('Type T {} '.format(type(T)))
plt.plot(X, Y)
plt.plot(X, T)
plt.title('Illumination change')
plt.xlabel('Time,[s]')
plt.ylabel('Light level, [Lx]')
plt.grid()
plt.xticks(rotation=-90)
plt.legend(['illumination', 'threshold {} Lx'.format(threshold)])
plt.show()
Вот, например, для наглядности добавлена прямая порогового значения для данного измерения на уровне 63 Люкс.
График в matplotlib не просто статический. Его можно увеличивать в интересующем месте и подставить поля графика в меню, которое расположено в нижнем левом углу окна.
Достоинства построения графиков на Python
Это бесплатно. В отличие от MatLab, MathCAD в Python вы можете строить графики абсолютно бесплатно.
Есть аналитика. Можно увеличивать график, сохранять график в формате *.png файла, задавать масштаб, подстраивать ширину полей, разворачивать шкалу, накладывать сетку.
По Python скрипту можно сгенерировать *.exe файл на случай, если захочется скрыть алгоритм построения графика.
Нет артефактов и временных файлов. Никаких *.o *.ld не нужно, как если бы вы решили писать графопостроитель на С++. Есть только *.py файл с исходником и больше ничего не нужно.
Всё делается чисто кодом. Вам даже мышка не нужна чтобы построить график. Не будет болеть запястье.
Благодаря Python можно исполнять скрипты в любой операционной системе: Windows, Linux и проч. Главное чтобы был интерпретатор Python и графическая оболочка.
Недостатки построения графиков в Python
Не совсем ясно как отображать отсчеты графика в реальном времени. Например когда числа поступают с улицы из последовательного COM пота или TCP сокета.
Вывод
Интерпретатор Python в связке с Matplotlib это отличный вариант для визуализации экспериментальных данных из текстового *.csv файла.
Акроним |
Расшифровка |
CSV |
Comma-Separated Values |
PC |
personal computer |
Links
Комментарии (7)
HemulGM
16.07.2023 04:15+1Бесплатных инструментов много
Интерактивных графиков тоже много, в том числе бесплатных
Ты не скроешь код построения графика (да и зачем - не понятно, если данные из csv), потому что большинство способов сделать ехе из питона - это самораспаковывающийся архив и открыть его можно архиватором и взять напрямую код
Это что вообще за чушь? Как сделаешь билдер графиков так он и будет работать. Я больше скажу, большинство решений тоже не создаёт никаких временных файлов. Пишем программу - один ехе, запускаем и она работает без проблем. Ещё и быстро
А это - сомнительное "достижение", требующее постоянно иметь под рукой документацию по библиотеке. Т.к. нет возможности просто изучить инструмент визуально и посмотреть что и как изменится. В чем проблема не использовать мышку - не понятно. У вас нет мышки? Уверен - есть.
Кроссплатформенность - давно не проблема и не крутая фича.
А вот реальные недостатки:
Код всегда открытый, даже если действительно требуется его скрыть нужно использовать разные костыли
Работа с большим количеством данных - черевато потере работоспособности
Кроссплатформенность не такая и кроссплатформенная, потому что зависимости, которые тянет питон зачастую могут не иметь кроссплатформенного решения. Да, не все а даже большинство библиотек для питона являются бинарными и подключаются динамически (dll, so, o, ...)
График использует почту способ использования данных - мы просто их ему передаём (копируем), а он рисует. В крупных программах, нацеленных на работу с большим количеством данных используются датасеты, которые могут не хранить все данные в оперативной памяти. (Хотя тут повтор со вторым пунктом)
atshaman
16.07.2023 04:15-1mathplotlib как по мне - слишком уж "развесистый". Если не копипастить из хаутуя в хаутуй, а разбираться из чего оно состоит и как работает - такое себе. Для задачки "быстро визуализировать набор данных" проще взять pandas, а если нужно что-нибудь совсем-совсем легковесное без лишних зависимостей практически без "порога вхождения" - то pygal.
economist75
16.07.2023 04:15+4На python c либами доступны все актуальные способы визуализации из других языков программирования (около ~50).
Pandas не просто прячет "все ужасы Matplotlib" внутрь простого метода df.plot(), но и поддерживает несколько других мощных либ рисования, прямо из коробки df.plot(..., backend=<name>)
altair
популярная либа декларативной графики, чертит вvega
bokeh
в лицеpandas_bokeh
echarts
свежак из мира Apache. Мощная, юзает свой методdf.eplot()
hvplot
илиholoview
, чертит вbokeh
, но может вmatplotlib
иplotly
plotly
еще одна очень популярная либа, чертит сама или методомiplot
из либыcufflinks
pdvega
чертит вvega
, см. такжеaltair
Графики - это всегда итерации в сторону прекрасненького, поэтому их сразу правильнее чертить в
JupyerLab
- ведь в нем многие сложные вещи окажутся еще проще (автоналожение графиков при вызове неск. df.plot() в одной ячейке, "кристальный" вывод в SVG, доступ коллегам в LAN/WAN как веб-приложения, добавление интерактивности - списков, кнопок итд).Pab10
16.07.2023 04:15+1Спасибо за ваш комментарий, аггрегирует много полезных либ. От себя добавлю что plotly - та еще ботва, во всяком случае на фронте. Куча пуллреквестов с фиксами висят с табличкой СМЕРЖИМ, КОГДА ДАДИТЕ НАМ ДЕНЕГ, ну и в целом эти ребята очень меркантильные и неторопливые, не рекомендую. Документация полный трэш. Столкнулся с plotly потому, что на момент выбора bokeh прибывал в забвении.
Javian
Поступают они в массив — его и отображайте. Несколько раз в секунду сможет перерисовываться.