Към съдържанието
wannacode

Първата графика

Накратко: Графиката в matplotlib е фигура с оси: plot чертае линия, bar чертае стълбове, а заглавието, надписите на осите и легендата казват какво се вижда.

Проблем

„Покажи ми годината“

Управителят иска да види как върви годината. Вече знаеш как да сметнеш оборота по месеци: редовете на поръчките без отказаните, сбор по месец. Месецът е първите 7 знака на ordered_at, например „2026-03“:

Pythonданни: таблиците на магазина

Числата са верни, но от 12 реда трудно се вижда кое е върх и кое спад. Декември е 15 915,90 €, а януари е 7 228,20 €. Колко голям е спадът спрямо другите месеци? От таблица окото не го хваща. От линия го хваща веднага.

Идеята

Фигура и ос

В урока „Добре дошъл“ видя графика с един ред код. Сега ще видиш какво стои зад нея.

Графиката в matplotlib има два обекта:

  • фигурата (Figure) е целият лист: размерът и записът във файл;
  • оста (Axes) е полето с хоризонтала и вертикала, където се рисува.

plt.subplots() дава и двете: fig, ax = plt.subplots(). После рисуваш в оста. ax.plot(x, y) свързва точките с линия:

Pythonданни: таблиците на магазина

[графика] в текста на изхода значи, че графиката е без заглавие. Линията вече показва върха през декември и дупката след него. Липсват ѝ обаче три неща: заглавие, надписи на осите и месеци, които се четат.

По-точно, за любопитните

Тук и в Jupyter графиката се показва сама в края на клетката, затова няма plt.show(). В скрипт (python chart.py) я показваш с plt.show() или я записваш с fig.savefig('monthly.png'), иначе скриптът свършва и фигурата изчезва.

plt.plot(...) без fig, ax също рисува: тогава matplotlib сам взима „текущата“ ос. Това е удобно за една бърза графика, но при няколко оси не знаеш коя е текущата. Затова тук винаги рисуваме в изрична ос.

Идеята

Заглавие, надписи и етикети

Графика без надписи кара читателя да гадае. Оста има метод за всяко нещо:

  • ax.set_title казва какво гледаш;
  • ax.set_xlabel и ax.set_ylabel казват какво има по хоризонталата и по вертикалата;
  • ax.tick_params(axis='x', labelrotation=45) завърта етикетите (tick labels), числата и имената под оста, за да не се застъпват;
  • fig.tight_layout() подрежда листа, за да не се режат завъртените надписи.

marker='o' слага точка на всеки месец:

Pythonданни: таблиците на магазина

Сега се вижда, че 11 месеца са между 7 000 и 10 000 €, а декември е над 15 000 €. Януари, февруари и септември са най-ниско. Защо е спадът през септември, ще разберем в проекта.

Пробвай

Поръчките по месеци

Начертай броя поръчки за всеки месец (без отказаните) като линия. Запиши броя в counts, а на графиката сложи заглавие и надписи на двете оси.

Pythonданни: таблиците на магазина

Идеята

Стълбове: ax.bar

Линията свързва точки и казва „оттук дотук нещо се е менило“. Това има смисъл за месеци, които вървят един след друг. Категориите не вървят една след друга: за тях рисуваш стълбове (bar chart) с ax.bar(имена, стойности).

Оборотът по категории иска името на категорията на всеки ред: продукт → category_id → име. Два map го дават:

Pythonданни: таблиците на магазина

Стълбовете са 6, а сборът им е 107 466,20 €. Оборотът за годината е 111 186,20 €. Липсват 3 720 €: подаръчната карта е без категория, map ѝ дава NaN, а groupby пропуска NaN тихо. Графиката изглежда наред. Затова преброй стълбовете и сравни сбора с оборота.

Пробвай

Всички категории

Начертай оборота по категории така, че подаръчната карта да е свой стълб. Запиши оборота по категории в by_cat, сложи заглавие и надпис на вертикалата.

Pythonданни: таблиците на магазина

Идеята

Съкращението: df.plot

Series и DataFrame имат метод plot. Той вика matplotlib вместо теб: kind='line' (по подразбиране), kind='bar' и другите видове, които идват в следващите уроци. С ax=ax рисува в твоята ос. После я довършваш с методите на оста, както досега:

Pythonданни: таблиците на магазина

pandas е сложил имената на категориите под стълбовете и ги е завъртял. Сложил е и надпис на хоризонталата: името на индекса, category. Заглавието и вертикалата са от твоя код.

Двата начина дават една и съща графика. ax.bar ти дава пълен контрол. df.plot спестява редове, когато данните вече са в Series или в таблица.

1. Създал си fig, ax = plt.subplots(). Къде рисува monthly.plot(ax=ax)?

Идеята

Няколко линии и легенда

Декември е върхът на годината. Всички категории ли растат еднакво? Две линии в една ос отговарят. Всеки ax.plot добавя линия, label ѝ дава име, а ax.legend() слага легендата: кутийка, която казва коя линия коя е:

Pythonданни: таблиците на магазина

Кухнята скача от 964,80 € през ноември на 3 240,60 € през декември, 3,4 пъти. После пада на 592,80 € през януари. Вероятно тиганът и ножовете се купуват за подарък. Млечните растат по-малко: от 2 792,10 € на 3 561,20 €.

Таблица с колона за всяка категория df.plot рисува наведнъж, по линия за колона, с легенда от имената на колоните. Това е причината в урока за pivot_table таблицата да е широка:

Pythonданни: таблиците на магазина

Седем линии в една ос вече се преплитат. Коя графика кога помага и как да покажеш много серии, без да се преплитат, е следващият урок.

Упражнение

Кой носи декември?

Двете големи групи категории са Храни и Дом (parent_id в categories.csv). Начертай оборота на всяка по месеци като две линии в една ос, с легенда, заглавие и надписи на осите. Таблицата по месец и група запиши в pv.

Pythonданни: таблиците на магазина

Тест

Провери се

1. Кой от двата обекта има set_title, set_xlabel и plot?
2. Надписите на месеците под графиката се застъпват. Какво помага?
3. Пускаш същия код като файл chart.py в терминала и не виждаш нищо. Защо?
4. Подаръчната карта е без категория. Колко стълба дава lines.groupby("category")["revenue"].sum() начертано с ax.bar?
5. Начертал си две линии с ax.plot(...) и си извикал ax.legend(), но легендата е празна. Защо?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·