Shanraq.org Shanraq.org
matplotlib: бірінші график және терезе емес, файл
IT

Python: деректен өз есебіңізге дейін 33-сабақ (барлығы 56)

matplotlib: бірінші график және терезе емес, файл

Python курсының отыз екінші сабағы. Өткен сабақтағы қатарды саламыз: парақ пен осьтер, сызық, белгілер, тор, аңыз — әрі экранда бірде-бір терезесіз файлға сақтау. Плюс бәрінде графикті бұзатын үш нәрсе: `Agg`, «алдымен саламыз, сосын сақтаймыз» реті және жабылмаған фигура.

Не үшін керек

Кестедегі отыз сан жарты минутта оқылады, әрі содан кейін олар туралы ештеңе түсініксіз. Сол отызы сызықпен бір секундта оқылады: қатардың өсіп келе жатқаны, жиырма алтыншы қаңтарда секіріс болғаны және одан кейін ол қайталанбағаны көрініп тұр.

Бұл үшін төлеуге тура келеді. График — деректі көрсетудің ең сенімді әрі бұрмалауға ең оңай тәсілі: сол сандар басқа шкалада басқа нәрсе айтады. Онымен келесі сабақ айналысады — шкала, нөл және белгілер туралы. Бүгін — жалпы қалай салып, қалай сақтау керегі.

Кітапхана pandas тұрған жерге орнатылады:

pip install matplotlib==3.11.1

Бірден тұтас

grafik.py файлы. Отыз бірінші сабақтағы сол бағам қатары және екі сызық та: нағызы мен тегістелгені.

"""32-сабақ: бірінші график.

Өткен сабақтағы сол бағам қатары. Сызық саламыз, осьтерді белгілейміз, файлға
сақтаймыз — әрі экранда бірде-бір терезе жоқ.
"""

import matplotlib

# Экрансыз: кесте бойынша жұмыс істейтін бағдарлама терезеге емес, файлға
# салады. Бұл жол pyplot импортына дейін тұрады — әйтпесе ол басқа тәсілді
# таңдап үлгереді.
matplotlib.use("Agg")

import matplotlib.pyplot as plt
import pandas as pd
from pathlib import Path

HERE = Path(__file__).resolve().parent

days, rates = [], []
start = pd.Timestamp("2026-01-05")
for i in range(40):
    day = start + pd.Timedelta(days=i)
    if day.weekday() >= 5:
        continue
    value = 512.0 + i * 0.35 + ((i * 7) % 11 - 5) * 0.6
    if i == 21:
        value += 14.0
    days.append(day)
    rates.append(value)
rate = pd.Series(rates, index=pd.DatetimeIndex(days, name="day"), name="rate").round(2)

# Figure — қағаз парағы, Axes — сол парақтағы осьтер. Бүкіл сурет ax арқылы.
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(rate.index, rate.values, color="#b03a2e", linewidth=1.6, label="бағам")
ax.plot(rate.index, rate.rolling(5).mean(), color="#7f8c8d", linewidth=1.2,
        linestyle="--", label="жылжымалы орташа, 5 күн")

ax.set_title("Доллар бағамы, 2026 қаңтар — ақпан")
ax.set_xlabel("күн")
ax.set_ylabel("доллар үшін теңге")
ax.grid(True, linewidth=0.4, alpha=0.5)
ax.legend()
fig.autofmt_xdate()

out = HERE / "kurs.png"
fig.savefig(out, dpi=150, bbox_inches="tight")
plt.close(fig)

print("графиктегі нүкте:", len(rate))
print("осьтердегі сызық:", len(ax.get_lines()))
print("Y осінің белгісі:", ax.get_ylabel())
print("файл:", out.name, "| жасалды:", out.exists(), "| бос емес:", out.stat().st_size > 0)

Шығысы:

графиктегі нүкте: 30
осьтердегі сызық: 2
Y осінің белгісі: доллар үшін теңге
файл: kurs.png | жасалды: True | бос емес: True

Ал бағдарламаның қасында kurs.png пайда болады — сол суреттің өзі.

Талдау

Agg: экрансыз бағдарлама

matplotlib.use("Agg") бірінші жолда тұрғаны кездейсоқ емес. Әдепкі күйінде matplotlib терезе көрсету тәсілін іздейді, ал таңғы төртте кесте бойынша іске қосылған бағдарламада (жиырма үшінші сабақ) экран жоқ. Agg — бұл «файлға сал», әрі онымен терезенің қажеті мүлде жоқ.

Оны import matplotlib.pyplot-тан бұрын қою керек: pyplot сурет салу тәсілін импорт кезінде таңдайды, одан кейін өзгерту кеш.

Сондықтан бағдарламада импорттардың реті әдеттен тыс: алдымен matplotlib, сосын use жолы, содан кейін ғана pyplot. Бұл — курстағы импорттар қатарынан тұрмайтын жалғыз жер, әрі линтер оған ренжиді — ал жұмыс істейтіні тек осылай.

Парақ пен осьтер

fig, ax = plt.subplots(figsize=(8, 4)) екі нәрсе жасайды:

  • fig — қағаз парағы: оның дюйммен өлшемі бар әрі сақтау соған жасалады;
  • ax — сол парақтағы осьтер: оларға салады, оларды белгілейді, олардың өз торы бар.

Қысқарақ салуға да болады — plt.plot(...), — бірақ сонда сіз кітапхана өзінде ұстап отырған «ағымдағы» осьтерге саласыз. График біреу болғанда айырмасы жоқ; екеу болған бойда «ағымдағы» осьтер керегі емес болып шығады. ax арқылы мұндай қате болмайды, әрі курс сабақтарында тек сол қолданылады.

figsize пиксельмен емес, дюймен беріледі: пиксельдер сақтау кезінде, дюймге dpi қосылғанда пайда болады.

Сызық және оның түрі

ax.plot(x, y) сызық салады. Анық беруге тұрарлықтары:

  • color — қатарларды түспен ажыратады; бір қатар үшін ол барлық графигіңізде бірдей болсын;
  • linewidth — қалыңдығы; бастысын қалыңырақ етеді;
  • linestyle="--" — көмекшісі үшін пунктир: мысалдағы тегістелген сызық әдемілік үшін емес, оны деректен ажырату үшін пунктир;
  • label — аңыздағы жазу; онсыз ax.legend() көрсететін ештеңе таппайды.

Белгілер — әшекей емес

Осьтері белгіленбеген график — дерек емес, сурет. Әрқашан жазылатын төрт жол:

ax.set_title(...)    бұл не екені
ax.set_xlabel(...)   көлденеңінен не тұрғаны
ax.set_ylabel(...)   тігінен не тұрғаны және қандай өлшемде
ax.legend()          қай сызық қайсы екені

ax.grid(True, linewidth=0.4, alpha=0.5) тор қосады — бозғылт, ол мәндерді оқуға көмектессін, сызықтармен таласпасын деп. fig.autofmt_xdate() күндер сыймай қалғанда оларды бұрады.

savefig: пішім кеңейтім бойынша

fig.savefig("kurs.png", dpi=150, bbox_inches="tight"):

  • пішім кеңейтімнен алынады: .png — хатқа және мессенджерге арналған сурет, .svg — бетке (сапасын жоғалтпай масштабталады), .pdf — басып шығаруға;
  • dpi дюймді пиксельге айналдырады: 150-де 8 дюйм — ені бойынша 1200 нүкте. Экранға 100–150 жетеді, басып шығаруға 300 алады;
  • bbox_inches="tight" бос жиектерді қиып тастайды, әйтпесе суреттің айналасында ауа қалады.

Басты ереже — рет: savefig шақырылған сәтте салынғанды суретке түсіреді. plot-қа дейін сақтадыңыз — бос парақ алдыңыз, әрі бұл кезде ешқандай қате болмайды. Бұл — үшінші жаттығу.

close: фигуралар өздігінен жоғалмайды

plt.close(fig) парақты босатады. График біреу болғанда бұл байқалмайды; күніне бір суреттен салып, оларды жаппайтын бағдарлама жиырма бірінші күні ескерту алады, содан кейін жадты жеп қояды. Әдет қарапайым: салдық — сақтадық — жаптық.

pandas өзі де біледі

Series мен DataFrame-нің өз .plot()-ы бар, әрі ол сол matplotlib-пен салады:

ax = rate.plot(figsize=(8, 4), color="#b03a2e")
ax.set_ylabel("доллар үшін теңге")

Ол сол Axes-ті қайтарады, сондықтан белгілер мен сақтау әдеттегідей жасалады: ax.figure.savefig(...). Деректі тез шолып өту үшін бұл қысқа. Біреу көретін есеп үшін әдетте анық fig, ax алынады — онда не болып жатқаны түгел көрініп тұрады.

Сабақ картасы

Сабақ картасы: парақ, осьтер және файл

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.

  1. matplotlib.use("Agg") жолы не үшін керек және ол неге pyplot импортына дейін тұрады?
  2. fig ax-тан несімен өзгеше және курста неге ax арқылы салады?
  3. savefig-ті plot-қа дейін шақырсақ не шығады, әрі бұл кезде қате бола ма?

Жаттығу

Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, түзету. Жауаптар — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.

1. Болжаңыз. Бұл бағдарлама не басып шығарады?

import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6, 3))
ax.plot([1, 2, 3], [10, 12, 11], label="ряд")
ax.set_title("сынақ")
ax.set_ylabel("теңге")
print("сызық:", len(ax.get_lines()), "| тақырып:", ax.get_title(), "| Y осі:", ax.get_ylabel())
print("парақ өлшемі:", fig.get_size_inches().tolist(), "дюйм")
plt.close(fig)

2. Бос орынды толтырыңыз. ... орнына бағдарламаға экран қажет болмайтын сурет салу тәсілін қойыңыз.

# бұл жолсыз кесте бойынша жұмыс істейтін бағдарлама терезе іздейді
import matplotlib

matplotlib.use(...)

import matplotlib.pyplot as plt

print("сурет салу тәсілі:", matplotlib.get_backend())
fig, ax = plt.subplots()
ax.plot([1, 2], [3, 4])
plt.close(fig)

3. Түзетіңіз. Файл жасалады, бірақ ондағы сурет бос. Бағдарлама сақтау сәтінде осьтерде қанша сызық болғанын басып шығарады.

# салғаннан бұрын сақтап қойған
import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt
from pathlib import Path

HERE = Path(__file__).resolve().parent
fig, ax = plt.subplots()
out = HERE / "proba.png"
fig.savefig(out)
print("сақтау сәтіндегі сызық:", len(ax.get_lines()))
ax.plot([1, 2, 3], [10, 12, 11])
print("бағдарлама соңындағы сызық:", len(ax.get_lines()))
plt.close(fig)

Тапсырма

Міндетті. Сол қатарды алып, оны тегістелгенімен бірге салыңыз. Секіріс күнін — тегістелген сызық көрсетпейтін сол күнді — нүктемен және жазумен белгілеңіз. Осьтер мен тақырыпты белгілеңіз, аңыз бен тор қойыңыз. Екі файл сақтаңыз: хатқа kurs.png және бетке kurs.svg. Мыналарды басып шығарыңыз: нүкте саны, осьтердегі сызық саны, тақырып, белгіленген күн мен оның мәні және әр файл туралы бір жол.

Күтілетін шығыс:

нүкте: 30 | осьтердегі сызық: 3
тақырып: Доллар бағамы: нағыз қатар және тегістелгені
белгіленген күн: 2026-01-26 | мәні: 532.75
kurs.png: жасалды True, бос емес True
kurs.svg: жасалды True, бос емес True

Дайын болғаны: шығыс жол-жолымен сәйкес келеді; use("Agg") pyplot импортына дейін тұр; сурет plt арқылы емес, ax арқылы салынған; сақтау бүкіл суреттен кейін; фигура жабылған; екі файлда да сурет бос емес (ашып қараңыз).

Өз деректеріңізде. Өз қатарыңызды салыңыз — күндік шығыс, қадам саны, салмақ. Y осін өлшем бірлігімен міндетті түрде белгілеңіз. Содан кейін суретті деректеріңізді көрмеген адамға көрсетіп, не түсінгенін сұраңыз. Ол түсінбегеннің бәрі — графикте жетіспейтін нәрсе.

Қалауыңыз бойынша.

  • Бір графикті png, svg және pdf етіп сақтап, файл өлшемдерін салыстырыңыз.
  • dpi=72 мен dpi=300 қойып көріп, суреттегі мәтінге қараңыз.
  • Сол қатарды rate.plot(ax=ax) арқылы салып, белгілердің дәл солай қойылатынына көз жеткізіңіз.

Жобада бұл қайда тұрады

Он үшінші қадам: есепте сурет пайда болады. sholu/suret.py әр елге бір сызық салып, файлды CSV-дың қасына қояды, ал аңыздағы атауларды есеп оқитын сол анықтамадан алады — сондықтан суретте «KAZ» емес, «Қазақстан» тұр.

Сол файлдағы екі жол дәл жиынтық адамның алдында емес, кесте бойынша жұмыс істейтіндіктен тұр: pyplot импортына дейінгі matplotlib.use("Agg") — таңғы төртте экран жоқ; және сақтаудан кейінгі plt.close(fig) — әйтпесе күніне бір сурет салатын бағдарлама жабылмаған фигуралар туралы жиырма бірінші күні біледі.

Әлі қарастырылмағаны. Түстер кодта тізіммен берілген. Қатар үшеу болғанда бұл қалыпты; көбейгенде түстер есептің қалған көрінісімен бірге бір жерде тұрғысы келеді.

Жауаптар

Жауаптарды көрсету

Сұрақтарға

  1. Ол matplotlib-ке терезеге емес, файлға салуды айтады. Кесте бойынша іске қосылған бағдарламаға экран қолжетімсіз, әрі бұл жолсыз ол оны іздей бастайды. pyplot импортына дейін қойылады, өйткені pyplot сурет салу тәсілін импорт кезінде таңдайды — одан кейін өзгерту кеш.
  2. fig — парақ: өлшемі, жиегі, сақтауы. ax — парақтағы осьтер: сызықтар, белгілер, тор, аңыз. ax арқылы салатын себебі — plt.plot «ағымдағы» осьтерге салады, ал график екеу болғанда ағымдағысы керегі емес болып шығады.
  3. Бос сурет шығады, әрі қате болмайды. savefig шақырылған сәтте салынғанды сақтайды; одан кейін салынғанның бәрі файлға түспейді.

Жаттығуға

  1. ax өзінде не салынғанын және қалай белгіленгенін біледі, ал fig — өзінің дюйммен өлшемін, figsize-де берілген сол өлшемді.
сызық: 1 | тақырып: сынақ | Y осі: теңге
парақ өлшемі: [6.0, 3.0] дюйм
  1. matplotlib.use("Agg"). Сурет салу тәсілінің аты жолмен жазылады, әрі get_backend() кейін соны қайтарады.
import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt

print("сурет салу тәсілі:", matplotlib.get_backend())
fig, ax = plt.subplots()
ax.plot([1, 2], [3, 4])
plt.close(fig)
сурет салу тәсілі: Agg
  1. savefig-ті plot-тан кейін көшіру. Сақтау сәтіндегі нөл сызық — жауаптың өзі: файлда бос, бірақ бағдарлама бірде-бір шағымсыз аяқталды.
import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt
from pathlib import Path

HERE = Path(__file__).resolve().parent
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [10, 12, 11])
out = HERE / "proba.png"
fig.savefig(out)
print("сақтау сәтіндегі сызық:", len(ax.get_lines()))
print("бағдарлама соңындағы сызық:", len(ax.get_lines()))
plt.close(fig)
сақтау сәтіндегі сызық: 1
бағдарлама соңындағы сызық: 1

Тапсырмаға

Нүкте мен жазу нағыз қатарға қойылады: ax.plot([күн], [мән], marker="o") және ax.annotate(...). Тапсырманың мәні — суретте өткен сабақ айтқан нәрсенің дәл өзі көрінсін: тегістелген сызық оқиғаның жанынан өтеді, әрі оның қасында бұл бір қараған бойда байқалады.

Екі файл бір фигурадан сақталады: savefig-ті қанша рет шақырса да, фигура одан өзгермейді. Оны бір рет, барлық сақтаудан кейін жабады.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.