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 алынады — онда не болып жатқаны түгел көрініп тұрады.
Сабақ картасы
Өз сөзіңізбен айтыңыз
Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.
matplotlib.use("Agg")жолы не үшін керек және ол неге pyplot импортына дейін тұрады?figax-тан несімен өзгеше және курста негеaxарқылы салады?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) — әйтпесе күніне бір сурет салатын бағдарлама жабылмаған фигуралар туралы жиырма бірінші күні біледі.
Әлі қарастырылмағаны. Түстер кодта тізіммен берілген. Қатар үшеу болғанда бұл қалыпты; көбейгенде түстер есептің қалған көрінісімен бірге бір жерде тұрғысы келеді.
Жауаптар
Жауаптарды көрсету
Сұрақтарға
- Ол matplotlib-ке терезеге емес, файлға салуды айтады. Кесте бойынша іске қосылған бағдарламаға экран қолжетімсіз, әрі бұл жолсыз ол оны іздей бастайды.
pyplotимпортына дейін қойылады, өйткені pyplot сурет салу тәсілін импорт кезінде таңдайды — одан кейін өзгерту кеш. fig— парақ: өлшемі, жиегі, сақтауы.ax— парақтағы осьтер: сызықтар, белгілер, тор, аңыз.axарқылы салатын себебі —plt.plot«ағымдағы» осьтерге салады, ал график екеу болғанда ағымдағысы керегі емес болып шығады.- Бос сурет шығады, әрі қате болмайды.
savefigшақырылған сәтте салынғанды сақтайды; одан кейін салынғанның бәрі файлға түспейді.
Жаттығуға
axөзінде не салынғанын және қалай белгіленгенін біледі, алfig— өзінің дюйммен өлшемін,figsize-де берілген сол өлшемді.
сызық: 1 | тақырып: сынақ | Y осі: теңге
парақ өлшемі: [6.0, 3.0] дюйм
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
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-ті қанша рет шақырса да, фигура одан өзгермейді. Оны бір рет, барлық сақтаудан кейін жабады.
Дереккөздер
- matplotlib: қысқаша кіріспе —
Figure,Axesжәне олардың неге екеу екені. - Сурет салу тәсілін таңдау —
Aggдеген не және ол қашан керек. - Суреттерді сақтау — пішімдер,
dpiжәне жиектер.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.