Когда я был ВУЗ(овцем) нам на первом курсе на лабораторных работах по Физике часто приходилось строить графики. Причем рисовать их приходилось от руки на миллиметровой бумаге. Выглядело это кустарно. С первого раза начертить график не получалось. Приходилось стирать ластиком. Миллиметровая шкала стиралась. На графике появлялись белые облака.

Тогда в 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 не просто статический. Его можно увеличивать в интересующем месте и подставить поля графика в меню, которое расположено в нижнем левом углу окна.

время рассвета 1:24:41
время рассвета 1:24:41

Достоинства построения графиков на Python

  1. Это бесплатно. В отличие от MatLab, MathCAD в Python вы можете строить графики абсолютно бесплатно.

  2. Есть аналитика. Можно увеличивать график, сохранять график в формате *.png файла, задавать масштаб, подстраивать ширину полей, разворачивать шкалу, накладывать сетку.

  3. По Python скрипту можно сгенерировать *.exe файл на случай, если захочется скрыть алгоритм построения графика.

  4. Нет артефактов и временных файлов. Никаких *.o *.ld не нужно, как если бы вы решили писать графопостроитель на С++. Есть только *.py файл с исходником и больше ничего не нужно.

  5. Всё делается чисто кодом. Вам даже мышка не нужна чтобы построить график. Не будет болеть запястье.

  6. Благодаря Python можно исполнять скрипты в любой операционной системе: Windows, Linux и проч. Главное чтобы был интерпретатор Python и графическая оболочка.

Недостатки построения графиков в Python

  1. Не совсем ясно как отображать отсчеты графика в реальном времени. Например когда числа поступают с улицы из последовательного COM пота или TCP сокета.

Вывод

Интерпретатор Python в связке с Matplotlib это отличный вариант для визуализации экспериментальных данных из текстового *.csv файла.

Акроним

Расшифровка

CSV

Comma-Separated Values

PC

personal computer

Links

https://translated.turbopages.org/proxy_u/en-ru.ru.769a89e5-64b314a2-b8a40da2-74722d776562/https/www.geeksforgeeks.org/how-to-plot-data-from-a-text-file-using-matplotlib/

Комментарии (7)


  1. Javian
    16.07.2023 04:15
    +2

    Не совсем ясно как отображать отсчеты графика в реальном времени. Например когда числа поступают с улицы из последовательного COM пота или TCP сокета.

    Поступают они в массив — его и отображайте. Несколько раз в секунду сможет перерисовываться.


  1. HemulGM
    16.07.2023 04:15
    +1

    1. Бесплатных инструментов много

    2. Интерактивных графиков тоже много, в том числе бесплатных

    3. Ты не скроешь код построения графика (да и зачем - не понятно, если данные из csv), потому что большинство способов сделать ехе из питона - это самораспаковывающийся архив и открыть его можно архиватором и взять напрямую код

    4. Это что вообще за чушь? Как сделаешь билдер графиков так он и будет работать. Я больше скажу, большинство решений тоже не создаёт никаких временных файлов. Пишем программу - один ехе, запускаем и она работает без проблем. Ещё и быстро

    5. А это - сомнительное "достижение", требующее постоянно иметь под рукой документацию по библиотеке. Т.к. нет возможности просто изучить инструмент визуально и посмотреть что и как изменится. В чем проблема не использовать мышку - не понятно. У вас нет мышки? Уверен - есть.

    6. Кроссплатформенность - давно не проблема и не крутая фича.

    А вот реальные недостатки:

    1. Код всегда открытый, даже если действительно требуется его скрыть нужно использовать разные костыли

    2. Работа с большим количеством данных - черевато потере работоспособности

    3. Кроссплатформенность не такая и кроссплатформенная, потому что зависимости, которые тянет питон зачастую могут не иметь кроссплатформенного решения. Да, не все а даже большинство библиотек для питона являются бинарными и подключаются динамически (dll, so, o, ...)

    4. График использует почту способ использования данных - мы просто их ему передаём (копируем), а он рисует. В крупных программах, нацеленных на работу с большим количеством данных используются датасеты, которые могут не хранить все данные в оперативной памяти. (Хотя тут повтор со вторым пунктом)


  1. Abobcum
    16.07.2023 04:15
    +6

    Я просто оставлю это здесь

    pd.read_csv('1.csv')[['n','k']].plot()


  1. atshaman
    16.07.2023 04:15
    -1

    mathplotlib как по мне - слишком уж "развесистый". Если не копипастить из хаутуя в хаутуй, а разбираться из чего оно состоит и как работает - такое себе. Для задачки "быстро визуализировать набор данных" проще взять pandas, а если нужно что-нибудь совсем-совсем легковесное без лишних зависимостей практически без "порога вхождения" - то pygal.


  1. 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 как веб-приложения, добавление интерактивности - списков, кнопок итд).


    1. Pab10
      16.07.2023 04:15
      +1

      Спасибо за ваш комментарий, аггрегирует много полезных либ. От себя добавлю что plotly - та еще ботва, во всяком случае на фронте. Куча пуллреквестов с фиксами висят с табличкой СМЕРЖИМ, КОГДА ДАДИТЕ НАМ ДЕНЕГ, ну и в целом эти ребята очень меркантильные и неторопливые, не рекомендую. Документация полный трэш. Столкнулся с plotly потому, что на момент выбора bokeh прибывал в забвении.


  1. volokhar
    16.07.2023 04:15
    +2

    А чем тот же gnuplot не угодил?