Гистограмма ва графики нуқтагӣ
Чаро тақсимот ва робитаро меомӯзем?
Адади миёна ҷузъиётро пинҳон мекунад: гурӯҳи зичи мушоҳидаҳо ва ду гурӯҳи аз ҳам дур метавонанд миёнаи якхела дошта бошанд. Тақсимот нишон медиҳад, ки кадом қиматҳо бештар вомехӯранд ва парокандагӣ чӣ қадар аст. Барои он гистограмма истифода мешавад. Он ҳангоми таҳлили давомнокии амалиёт, андозаи файлҳо ё натиҷаҳои ченкунӣ муфид аст.
Агар ҳар объект ду бузургӣ дошта бошад, саволи дигар ҷолиб мешавад: онҳо якҷоя чӣ гуна тағйир меёбанд? Графики нуқтагӣ ҷуфтҳои ададҳоро бе хати пайвасткунанда нишон медиҳад. Масалан, андозаи файл ва вақти коркарди онро муқоиса кардан мумкин аст. Ҳар мисоли поён мустақил аст; натиҷаи матнӣ тасвирро пурра карда, маълумоти объектҳоро месанҷад.
1. Гистограмма қиматҳоро гурӯҳбандӣ мекунад
Бар хилофи bar, функсияи hist мушоҳидаҳои алоҳидаро мегирад, на баландиҳои тайёрро. Фосила (bin) қисми меҳвари ададӣ аст. Баландии сутун бо танзимоти пешфарз ба шумораи мушоҳидаҳои ба ин фосила афтода баробар мебошад.
import matplotlib.pyplot as plt
counts, edges, bars = plt.hist([1, 2, 2, 6, 8], bins=2, edgecolor="black")
print(counts.tolist())
print(edges.tolist())
print(len(bars))
Натиҷа:
[3.0, 2.0]
[1.0, 4.5, 8.0]
2
Дар ин ҷо диапазони аз 1 то 8 ба ду қисми баробар ҷудо шуд. Ба қисми аввал 1, 2, 2 ва ба дуюм 6, 8 афтоданд. hist шумораҳои counts, сарҳадҳои edges ва контейнери сутунҳои bars-ро бармегардонад. Барои ду фосила се сарҳад лозим аст: шумораи сарҳадҳо ҳамеша аз шумораи фосилаҳо якто зиёд аст.
2. Шумораи фосилаҳо ё рӯйхати сарҳадҳо
bins=2 ду фосилаи баробарро дархост мекунад, ки аз диапазони маълумот ҳисоб мешаванд. Рӯйхати bins=[0, 3, 6, 9] се фосилаи мушаххас медиҳад. Сарҳадҳои собит вақте лозиманд, ки натиҷаҳои маҷмӯъҳои гуногунро бо як шкала муқоиса кунем.
import matplotlib.pyplot as plt
counts, edges, bars = plt.hist([0, 2, 3, 5, 6, 9, 10], bins=[0, 3, 6, 9])
print(counts.tolist())
print(int(sum(counts)))
Натиҷа:
[2.0, 2.0, 2.0]
6
Фосилаҳо инҳоянд: [0, 3), [3, 6), [6, 9]. Қавси мудаввар дохил нашудани сарҳад ва қавси мураббаъ дохил шудани онро нишон медиҳад. Қимати 3 ба фосилаи дуюм ва 6 ба сеюм меравад. Танҳо фосилаи охирин сарҳади ростро дар бар мегирад: 9 ҳисоб шуд, вале 10 берун аз диапазони муайян аст ва гузаронда шуд. Аз ин рӯ аз ҳафт мушоҳида шашто ҳисоб шуд.
Шумораи фосилаҳоро танҳо барои расми зебо интихоб накунед. Фосилаҳои хеле кам ҷузъиётро пинҳон мекунанд, хеле зиёд бошанд маълумотро ба сутунҳои парокандаи ҷудогона тақсим мекунанд. Аввал чанд варианти муносибро муқоиса кунед; агар гурӯҳҳо сарҳадҳои табиӣ дошта бошанд, онҳоро ошкоро диҳед.
3. Вақте ҳамаи мушоҳидаҳо якхелаанд
Хурдтарин ва калонтарин қимат метавонанд баробар бошанд, вале чунин маълумот дуруст аст. matplotlib диапазонро каме васеъ мекунад, то паҳноии фосилаҳо ғайрисифрӣ шавад:
import matplotlib.pyplot as plt
counts, edges, bars = plt.hist([4, 4], bins=2)
print(counts.tolist())
print(edges.tolist())
Натиҷа:
[0.0, 2.0]
[3.5, 4.0, 4.5]
Диапазон аз 3.5 то 4.5 шуд. Қимати 4 дар сарҳад ҷойгир буда, ба фосилаи дуюм тааллуқ дорад. Фосилаи холӣ ҳамчун сутуни баландиаш сифр мемонад: набудани мушоҳидаҳо низ маълумот аст.
4. Нуқтаҳо ба ҷойи хати пайвасткунанда
scatter(x, y) барои ҳар ҷуфт як нуқта мегузорад. Координатаҳо бояд дарозии якхела дошта, мувофиқати объектҳоро нигоҳ доранд. Маҷмӯи нуқтаҳо бармегардад ва get_offsets() координатаҳои онро мехонад.
import matplotlib.pyplot as plt
points = plt.scatter([1, 2, 4], [6, 5, 9])
print(points.get_offsets().tolist())
print(len(plt.gca().lines))
Натиҷа:
[[1.0, 6.0], [2.0, 5.0], [4.0, 9.0]]
0
Шумораи хатҳои одӣ сифр аст: scatter дар маҷмӯаҳои минтақа нигоҳ дошта мешавад, на дар lines. Абри моили нуқтаҳо метавонад робитаи бузургиҳоро нишон диҳад, вале худ аз худ исбот намекунад, ки яке сабаби дигар аст. Нуқтаҳои такрорӣ метавонанд ҳамдигарро пӯшонанд.
5. Ранг ва масоҳати ҳар нуқта
Параметри c ранг ва s масоҳати нишонро бо пунктҳои квадратии типографӣ муайян мекунад. Як қимат барои ҳама ё рӯйхат бо як қимат барои ҳар нуқта додан мумкин аст. alpha дараҷаи ношаффофиро аз 0 то 1 муайян мекунад.
import matplotlib.pyplot as plt
from matplotlib.colors import to_hex
xs = [1, 2, 4]
ys = [6, 5, 9]
colors = ["gold" if value > 7 else "gray" for value in ys]
points = plt.scatter(xs, ys, c=colors, s=[20, 40, 80], alpha=0.5)
print([to_hex(color) for color in points.get_facecolors()])
print(points.get_sizes().tolist())
Натиҷа:
['#808080', '#808080', '#ffd700']
[20, 40, 80]
Нуқтаи охирин тиллоӣ аст, зеро y-и он аз 7 калон мебошад. Рӯйхати рангҳо бо ҳамон тартиби координатаҳо сохта мешавад. Ду баробар кардани s масоҳатро ду баробар мекунад, на қутрро. to_hex дар мисол рангро бе канали шаффофият нишон медиҳад; alpha=0.5 нуқтаҳоро дар тасвир нимшаффоф мекунад.
6. Шкалаи ададии ранг
Агар ба c ададҳо дода шаванд, matplotlib онҳоро бо харитаи рангҳои cmap ба ранг табдил медиҳад. Ин барои бузургии сеюми вобаста ба ҳар нуқта қулай аст. colorbar нишон медиҳад, ки рангҳо ба кадом ададҳо мувофиқанд.
import matplotlib.pyplot as plt
points = plt.scatter([1, 2, 4], [6, 5, 9], c=[10, 20, 30], cmap="viridis")
plt.colorbar(points)
print(points.get_array().tolist())
print(len(plt.gcf().axes))
Натиҷа:
[10.0, 20.0, 30.0]
2
Шкалаи ранг минтақаи иловагӣ мегирад, бинобар ин акнун расм ду минтақа дорад. Ба colorbar(points) маҷмӯи нуқтаҳое ошкоро дода шудааст, ки шкала ба онҳо тааллуқ дорад. Номҳои ранг мисли gray ранги тайёр ва ададҳои c маълумот барои табдил мебошанд: ин ду ҳолати гуногунанд.
Дар дохил чӣ рӯй медиҳад?
Ҳангоми сохтани гистограмма аввал сарҳадҳо муайян шуда, баъд мушоҳидаҳо ба фосилаҳо тақсим мешаванд. Шумораҳои ҳисобшуда ба росткунҷаҳо табдил меёбанд. color, edgecolor ва alpha намуди онҳоро тағйир медиҳанд, на қоидаи ҳисобро. Санҷиш метавонад баландӣ, координатаи чап ва паҳноии ҳар сутунро хонад.
Графики нуқтагӣ дигар хел аст: маҷмӯи PathCollection координатаҳо, андозаҳо ва рангҳои нишонҳоро нигоҳ медорад. Бо ин роҳ барои ҳар мушоҳида хосиятҳои алоҳида бе садҳо даъвати plot дода мешаванд. Барои тағйири шакли ҳамаи нуқтаҳо marker, масалан marker="s", истифода мешавад.
Хатоҳои маъмул ва ислоҳи онҳо
- Фосилаҳо ва сарҳадҳо омехта шудаанд.
bins=[0, 3, 6]ду сутун медиҳад, на се. Ислоҳ: ҳамаи сарҳадҳо, аз ҷумла сарҳади рости охиринро нависед. - Интизори дохил шудани сарҳади рост ба фосилаи чап. Ҳангоми
bins=[0, 3, 6]қимати 3 ба сутуни аввал намеафтад. Ислоҳ: қоидаи[чап, рост)-ро истифода баред ва истиснои фосилаи охиринро дар хотир доред. - Сутунҳо ба ҷойи тақсимот.
plt.bar(range(len(values)), values)баландии ҳар мушоҳидаро мекашад, на басомадҳоро. Ислоҳ: барои гурӯҳбандӣplt.hist(values, bins=...)истифода баред. - Хосиятҳои номувофиқи нуқтаҳо.
plt.scatter([1, 2, 3], [4, 5, 6], s=[20, 40])хатоиValueErrorмедиҳад. Ислоҳ: як андозаи умумӣ ё се андоза, яктоӣ ба ҳар нуқта диҳед; рӯйхати рангҳо низ ҳамин мувофиқатро талаб мекунад.
Ёддошт
| Вазифа | Навишт ё қоида |
|---|---|
| Фосилаҳои баробар дар диапазон | plt.hist(values, bins=k) |
| Сарҳадҳои муайян | plt.hist(values, bins=edges) |
| Қоидаи дохилшавӣ | [left, right), охирин [left, right] |
| Натиҷаи hist | шумораҳо, сарҳадҳо, сутунҳо |
| Ҷуфтҳо бе хат | plt.scatter(x, y) |
| Ранг, масоҳат, ношаффофӣ | c, s, alpha |
| Рангҳои ададӣ | c=numbers, cmap, plt.colorbar(points) |