Харитаҳои гармӣ
Чаро харитаҳои гармӣ лозиманд
Вақте додаҳо ду меҳвари гурӯҳбандӣ доранд, диаграммаҳои сутунии алоҳида хеле зиёд мешаванд. Масалан, сарбориро аз рӯи минтақа ва баст ё андозагириҳоро аз рӯи объект ва сенсор муқоиса кардан лозим аст. Харитаи гармӣ ҷадвали росткунҷаро нишон медиҳад: мавқеъ ба ҷуфти нишонаҳо ва ранг ба адад мувофиқ аст.
Ранг қиматҳои калон ва қонуниятҳоро зуд ошкор мекунад, навиштаҳо бошанд ададҳои дақиқро медиҳанд. Пешакӣ муайян кунед, ки хонаки холӣ чӣ маъно дорад ва кадом миқёс истифода мешавад. Вагарна набудани андозагириро сифр ва ранги якхелаи ду расмро қимати якхела пиндоштан мумкин аст.
1. Матритса, индекс ва номи сутунҳо
Матритса шабакаи росткунҷаи ададҳост. sns.heatmap массиви дученака ё DataFrame-ро қабул мекунад. Дар DataFrame навиштаҳои сатрҳо аз индекс ва навиштаҳои сутунҳо аз сарлавҳаҳо гирифта мешаванд. Сатри якуми ҷадвал дар боло ҷойгир мешавад.
Мисолҳоро пайдарпай дар як ҷаласаи Python иҷро кунед. plt.subplots() расми алоҳида ва Axes месозад; plt.show() расмро дар скрипти одӣ нишон медиҳад. Дар ин ҷо ба ҷойи акс навиштаҳо ва ададҳоро бо воситаҳои matplotlib месанҷем.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
loads = pd.DataFrame([[2, 8], [5, 3]], index=["east", "west"],
columns=["am", "pm"])
fig, ax = plt.subplots()
sns.heatmap(loads, ax=ax)
print([t.get_text() for t in ax.get_yticklabels()])
print([t.get_text() for t in ax.get_xticklabels()])
print(ax.collections[0].get_array().ravel().tolist())
Барориш:
['east', 'west']
['am', 'pm']
[2, 8, 5, 3]
Ададҳо сатр ба сатр омадаанд: аввал east ва баъд west. ax.collections[0] шабакаи рангаро дорад, get_array().ravel() бошад қиматҳои онро ба як рӯйхат мекушояд.
2. Қиматҳои дақиқ: annot ва fmt
Аннотатсия матни дохили хонак аст. annot=True навиштаҳоро фаъол мекунад, fmt формати онҳоро бе қавсҳои шаклдор медиҳад: "d" — ададҳои бутун, ".2f" — ду рақам пас аз нуқта, ".0%" — фоизҳо бе қисми касрӣ.
fig, ax = plt.subplots()
sns.heatmap(loads, annot=True, fmt="d", ax=ax)
print([t.get_text() for t in ax.texts])
fig, ax = plt.subplots()
sns.heatmap(loads / 10, annot=True, fmt=".0%", ax=ax)
print([t.get_text() for t in ax.texts])
Барориш:
['2', '8', '5', '3']
['20%', '80%', '50%', '30%']
Дар харитаи якум қиматҳои бутуни аслӣ ҳамчун ададҳои бутун чоп шудаанд. Дар дуюм ҷадвал ба 10 тақсим шудааст, бинобар ин формати фоизӣ 0.2-ро ба 20% табдил медиҳад. fmt танҳо намоиши матнро тағйир медиҳад: худи қиматҳо ва миқёси ранг аз нав ҳисоб намешаванд.
3. Палитра ва ҳудудҳои умумии миқёс
Палитра (cmap) ба қиматҳо рангҳоро мувофиқ мекунад. Палитраи пайдарпай, монанди "Blues", барои сарбории ғайриманфӣ мувофиқ аст: қимати калонтар ранги шадидтар дорад. Палитраи дуҷониба, монанди "coolwarm", фарқи инҳирофҳоро ба ду самт нишон медиҳад.
vmin ва vmax ҳудудҳои миқёси ададиро муайян мекунанд. Бе онҳо одатан қиматҳои хурдтарин ва калонтарини додаҳои нишоншуда истифода мешаванд. Барои муқоисаи чанд харита ҳудудҳои умумиро муайян кунед.
fig, ax = plt.subplots()
sns.heatmap(loads, cmap="Blues", vmin=0, vmax=10, ax=ax)
mesh = ax.collections[0]
print(mesh.norm.vmin, mesh.norm.vmax)
print(mesh.get_cmap().name)
Барориш:
0.0 10.0
Blues
Акнун қимати 8 дар харитаҳои дигар бо ҳамин палитра ва ҳудудҳои 0 ва 10 ранги якхела дорад. center=0 палитраи дуҷонибаро гирди сифр марказӣ мекунад, вале барои диапазони собит ҷойи vmin ва vmax-и ошкорро намегирад.
4. Аз дафтари дароз ба ҷадвали росткунҷа
Дар дафтар ҳар сатр як рӯйдод аст, аз ин рӯ як ҷуфти «минтақа ва баст» метавонад чанд бор вохӯрад. Ҷадвали ҷамъбастӣ (pivot_table) чунин сатрҳоро муттаҳид мекунад: index сатрҳои натиҷа, columns сутунҳо, values ададҳо ва aggfunc қоидаи муттаҳидкуниро муайян мекунад.
Дар мисол сарбории миёнаро аз рӯи минтақа ва баст муқоиса мекунем. Бар хилофи сифр, NaN маънои қимати мавҷуднабударо дорад. Барои ду ҷуфт умуман мушоҳида нест.
events = pd.DataFrame({"zone": ["east", "west", "east"],
"shift": ["am", "pm", "am"], "load": [2, 3, 6]})
table = events.pivot_table(index="zone", columns="shift", values="load",
aggfunc="mean")
print(table)
fig, ax = plt.subplots()
sns.heatmap(table, annot=True, fmt=".1f", ax=ax)
print([t.get_text() for t in ax.texts])
Барориш:
shift am pm
zone
east 4.0 NaN
west NaN 3.0
['4.0', '3.0']
Ду сабти east/am ба қимати миёнаи 4.0 табдил ёфтанд. Хонакҳои NaN дар харита пинҳон карда мешаванд ва навиштаи ададӣ намегиранд: танҳо 4.0 ва 3.0 чоп шудаанд. Агар набудани сабт воқеан маънои сифрро дошта бошад, fill_value=0 додан мумкин аст. Барои андозагириҳои мавҷуднабуда ин ивазкунӣ аксар вақт нодуруст аст.
pivot_table ба таври пешфарз калидҳоро мураттаб мекунад. Тартиби заруриро бо reindex(index=[...], columns=[...]) дақиқ кардан мумкин аст. Барои ҷамъ кардани қиматҳои рӯйдодҳо aggfunc="sum" ва барои шуморидани сабтҳо "count" интихоб мешавад. Ин қарорро пеш аз сохтани харита қабул мекунанд.
5. Коррелятсияи байни аломатҳои ададӣ
Коррелятсияи Пирсон алоқаи хаттии ду сутуни ададиро тавсиф мекунад. Қимати наздик ба 1 афзоиши якҷоя, наздик ба −1 афзоиши яке ҳангоми камшавии дигаре ва тақрибан 0 алоқаи хаттии сустро ифода мекунад. Коррелятсияи сифрӣ вобастагии ғайрихаттиро рад намекунад ва коррелятсияи баланд сабабиятро исбот намекунад.
Методи corr() ҷадвали коррелятсияҳои ҷуфтҳои сутунҳоро месозад.
measurements = pd.DataFrame({"length": [1, 2, 3, 4],
"delay": [8, 6, 4, 2]})
corr = measurements.corr()
print(corr)
fig, ax = plt.subplots()
sns.heatmap(corr, cmap="coolwarm", vmin=-1, vmax=1,
center=0, annot=True, fmt=".1f", ax=ax)
print([t.get_text() for t in ax.texts])
Барориш:
length delay
length 1.0 -1.0
delay -1.0 1.0
['1.0', '-1.0', '-1.0', '1.0']
Ҳар дафъа ҳангоми ба 1 зиёд шудани length бузургии delay ба 2 кам мешавад, бинобар ин коррелятсия −1 аст. Матритса симметрӣ аст ва диагонал барои сутунҳои ғайридоимӣ 1 мебошад. Миқёси аз −1 то 1 матритсаҳои гуногунро муқоисашаванда мекунад; ".1f" танҳо дақиқии навиштаҳоро идора мекунад.
Харита дар дохил чӣ гуна сохта мешавад
Аввал pandas ҷадвали росткунҷаро омода мекунад: рӯйдодҳоро муттаҳид ё коррелятсияҳоро ҳисоб мекунад. Баъд seaborn қиматҳои ададиро аз нишонаҳо ҷудо карда, ҷойҳои холиро мепӯшонад ва миқёси рангро муайян мекунад. matplotlib шабакаи хонакҳои ранга, миқёси ранг ва ҳангоми зарурат матнро месозад.
Ин ба ранг кардани нақшаи катакдор аз рӯи роҳнамо монанд аст: ҷадвал адади хонакро, меъёрбандӣ ҷойи онро дар миқёс ва палитра рангро муайян мекунад. Тағйири cmap ададҳои аслиро тағйир намедиҳад; тағйири aggfunc худи ададҳоро дигар мекунад.
Хатоҳои маъмул ва ислоҳи онҳо
1. Формати бутунро ба float татбиқ мекунанд
Пас аз тақсим қиматҳо касрӣ шуданд; чунин даъват нодуруст аст:
sns.heatmap(loads / 10, annot=True, fmt="d")
Барориш:
ValueError: Unknown format code 'd' for object of type 'float'
Формати "d" навъи бутунро талаб мекунад, ҳатто агар баъзе ададҳои касрӣ мисли бутун намоянд. Ислоҳ: fmt=".1f" ё ".0f"-ро истифода баред.
2. Харитаҳоро бо миқёсҳои худкор муқоиса мекунанд
Барои муқоиса дар диапазони 0–10 ин рамз нопурра аст:
fig, ax = plt.subplots()
sns.heatmap(loads, ax=ax)
mesh = ax.collections[0]
print(mesh.norm.vmin, mesh.norm.vmax)
Барориш:
2.0 8.0
Ҳудудҳо 2 ва 8 шуданд. Дар маҷмӯаи дигар онҳо метавонанд дигар бошанд ва рангҳо муқоисашаванда намемонанд. Ислоҳ: ба ҳамаи харитаҳои муқоисашаванда vmin, vmax ва cmap-и якхела диҳед.
3. pivot-ро ҳангоми ҷуфтҳои такрорӣ истифода мебаранд
Барои дафтари events чунин даъват нодуруст аст:
events.pivot(index="zone", columns="shift", values="load")
Барориш:
ValueError: Index contains duplicate entries, cannot reshape
pivot намедонад, ки ду сабти east/am-ро чӣ гуна якҷоя кунад. Ислоҳ: pivot_table-ро бо aggfunc-и мувофиқ истифода баред.
4. Аз сутуни доимӣ коррелятсияи 1-ро интизор мешаванд
Ин интизорӣ нодуруст аст: «дар диагонал ҳамеша якҳо ҳастанд»:
constant = pd.DataFrame({"a": [1, 1, 1], "b": [2, 3, 4]})
print(constant.corr())
Барориш:
a b
a NaN NaN
b NaN 1.0
Сутуни доимии a парокандагӣ надорад, бинобар ин коррелятсия бо он, аз ҷумла бо худаш, муайян нест. Ислоҳ: тағйирпазирии сутунҳоро санҷед ва аломатҳои доимиро аз тафсир хориҷ кунед. Иваз кардани ин NaN-ҳо бо сифр маънои натиҷаро дигар мекунад.
Ёддошт
| Вазифа | Чӣ истифода шавад |
|---|---|
| Нишон додани ҷадвал бо ранг | sns.heatmap(table) |
| Навиштаҳои хонакҳо | annot=True |
| Бутун / касрӣ / фоиз | fmt="d" / ".2f" / ".0%" |
| Интихоби палитра | cmap="Blues" ё "coolwarm" |
| Миқёси умумӣ | vmin=..., vmax=... |
| Маркази палитраи дуҷониба | center=0 |
| Дафтар ба ҷадвал | pivot_table(index=..., columns=..., values=..., aggfunc=...) |
| Пур кардани ҷуфтҳои мавҷуднабуда | fill_value=0, агар сифр маъно дошта бошад |
| Матритсаи алоқаҳои хаттӣ | df.corr() |