Як побудувати гістограму за допомогою Matplotlib в Python зі списком даних?


100

Я намагаюся скласти гістограму за допомогою matplotlib.hist()функції, але не знаю, як це зробити.

У мене є список

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

і список імен (рядків).

Як зробити імовірність моїм значенням y кожного з рядків і назвати як значення x?

Відповіді:


168

Якщо вам потрібна гістограма, вам не потрібно приєднувати будь-які `` імена '' до значень x, оскільки на осі x ви б мали контейнери для даних:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # `density=False` would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

введіть тут опис зображення

Ви можете зробити свою гістограму дещо вигадливішою за допомогою PDFрядка, заголовків та легенди:

import scipy.stats as st
plt.hist(x, density=True, bins=30, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 301)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

введіть тут опис зображення

Однак, якщо у вас обмежена кількість точок даних, як в OP, діаграма стовпчиків має більше сенсу представляти ваші дані (тоді ви можете прикріпити мітки до осі х):

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])

введіть тут опис зображення


4
Пам’ятайте, у кінці рядків у python немає крапок з комою!
Toad22222

10
@ Toad22222 Це уривок із комірки ноутбука Ipython. Спробуйте виконати його без крапки з комою і переконайтеся в різниці. Всі фрагменти коду, які я публікую на SO, чудово працюють на моєму комп’ютері.
Сергій Бушманов

2
Якщо ви задаєтеся питанням про крапку з комою, яку використовував Сергій, дивіться тут і № 16 тут про те, як півтонка використовується в клітинках зошитів Юпітера (раніше блокнотів IPython) під час побудови графіків для придушення тексту про об’єкт сюжету.
Уейн,

19

Якщо ви ще не встановили matplotlib, просто спробуйте команду.

> pip install matplotlib

Імпорт бібліотеки

import matplotlib.pyplot as plot

Дані гістограми:

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

Відображення гістограми

plot.show()

І результат виглядає так:

введіть тут опис зображення


2
Для прикладу лінія plot.axis ([50, 110, 0, 0.06]) 'марна. Окрім того, оскільки він жорстко кодує область сюжету для показу, якщо ваші дані не повністю вміщуються всередині них, ви можете заплутатися, чому вони відображаються неправильно.
typhon04

10

Хоча, схоже, питання вимагає побудови гістограми за допомогою matplotlib.hist()функції, можливо, це не можна зробити, використовуючи те саме, що остання частина запитання вимагає використовувати дані ймовірності як значення y стовпчиків і заданих імен (рядків) як значення x.

Я припускаю зразок списку імен, що відповідають заданим ймовірностям скласти сюжет. Простий графік бару служить меті для даної проблеми. Можна використовувати наступний код:

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

5

Це старе запитання, але жодна з попередніх відповідей не стосувалася справжньої проблеми, тобто того факту, що проблема полягає у самому питанні.

По-перше, якщо ймовірності вже розраховані, тобто агреговані дані гістограми доступні унормованим способом, тоді ймовірності повинні складати до 1. Вони, очевидно, не мають, і це означає, що тут щось не так, ні з термінологією, ні з даними або в тому, як задається питання.

По-друге, той факт, що мітки надаються (а не інтервали), як правило, означатиме, що ймовірності мають категоріальну змінну реакції - і найкраще використовувати графік графіку для побудови гістограми (або якийсь злом методу історії піплота), Відповідь Шаяна Шафіка надає код.

Однак, див. Випуск 1, ці ймовірності не є вірними, і використання в цьому випадку стовпчика, оскільки "гістограма" було б неправильним, оскільки з якихось причин не розповідає про історію одновимірного розподілу (можливо, класи перекриваються, а спостереження підраховуються багаторазово разів?) і такий сюжет у цьому випадку не слід називати гістограмою.

Гістограма за визначенням є графічним зображенням розподілу одновимірної змінної (див. Https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm , https://en.wikipedia.org/wiki / Гістограма) і створюється шляхом нанесення стовпчиків розмірів, що представляють кількість або частоту спостережень у вибраних класах змінної, що цікавить. Якщо змінна вимірюється на безперервній шкалі, ці класи є бінами (інтервалами). Важливою частиною процедури створення гістограми є вибір способу групування (або збереження без групування) категорій відповідей для категоріальної змінної, або як розділити область можливих значень на інтервали (де розмістити межі бункера) для безперервного змінна типу. Усі спостереження повинні бути представлені, і кожне лише один раз у сюжеті. Це означає, що сума розмірів брусків повинна дорівнювати загальній кількості спостережень (або їх площі у випадку змінної ширини, що є менш поширеним підходом). Або, якщо гістограма нормалізована, тоді всі ймовірності повинні складати до 1.

Якщо самі дані являють собою перелік "ймовірностей" як відповідь, тобто спостереження є значеннями ймовірності (чогось) для кожного об'єкта дослідження, то найкраща відповідь просто plt.hist(probability)з можливістю опції binning, і використання вже наявних міток x підозрілий.

Тоді графік стовпчика не слід використовувати як гістограму, а просто

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

з результатами

введіть тут опис зображення

matplotlib у такому випадку надходить за замовчуванням із наступними значеннями гістограми

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

результатом є набір масивів, перший масив містить кількість спостережень, тобто те, що буде показано на осі y графіку (вони складають до 13, загальна кількість спостережень), а другий масив є межами інтервалів для x -вісь.

Можна перевірити, чи вони однаково розташовані,

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

введіть тут опис зображення

Або, наприклад, для 3 бункерів (моє судження вимагає 13 спостережень) можна отримати цю гістограму

plt.hist(probability, bins=3)

введіть тут опис зображення

з даними сюжету "за гратами"

введіть тут опис зображення

Автору запитання потрібно пояснити, що означає перелік значень "ймовірність" - це "ймовірність" - це просто назва змінної відповіді (тоді чому для гістограми готові мітки x, це не має сенсу ), або значення списку - це ймовірності, розраховані на основі даних (тоді факт, що вони не складаються до 1, не має сенсу).


4

Це дуже крутий спосіб зробити це, але якщо ви хочете створити гістограму, де ви вже знаєте значення біна, але не маєте вихідних даних, ви можете використовувати np.random.randintфункцію для створення правильної кількості значень у межах кожного bin для графічної функції hist, наприклад:

import numpy as np
import matplotlib.pyplot as plt

data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

що стосується міток, ви можете вирівняти x галочки з контейнерами, щоб отримати щось подібне:

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.