Hist pandas: Способы создания гистограмм с помощью Python / Хабр
Способы создания гистограмм с помощью Python / Хабр
За последний год я сталкивалась с необходимостью рисования гистограмм и столбчатых диаграмм достаточно часто для того, чтобы появилось желание и возможность об этом написать. Кроме того, мне самой довольно сильно не хватало подобной информации. В этой статье приведен обзор 3 методов создания таких графиков на языке Python.
Начнем с того, чего я сама по своей неопытности не знала очень долго: столбчатые диаграммы и гистограммы — разные вещи. Основное отличие состоит в том, что гистограмма показывает частотное распределение — мы задаем набор значений оси Ox, а по Oy всегда откладывается частота. В столбчатой диаграмме (которую в англоязычной литературе уместно было бы назвать barplot) мы задаем и значения оси абсцисс, и значения оси ординат.
Для демонстрации я буду использовать избитый набор данных библиотеки scikit learn Iris. Начнем c импортов:
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
Преобразуем набор данных iris в dataframe — так нам удобнее будет с ним работать в будущем.
data = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
Из интересующих нас параметров data содержит информацию о длине чашелистиков и лепестков и ширине чашелистиков и лепестков.
Используем Matplotlib
Построение гистограммы
Cтроим обычную гистограмму, показывающую частотное распределение длин лепестков и чашелистиков:
fig, axs = plt.subplots(1, 2)
n_bins = len(data)
axs[0].hist(data['sepal length (cm)'], bins=n_bins)
axs[0].set_title('sepal length')
axs[1].hist(data['petal length (cm)'], bins=n_bins)
axs[1].set_title('petal length')
Построение столбчатой диаграммы
Используем методы matplotlib-а, чтобы сравнить ширину листьев и чашелистиков. Это кажется удобнее всего делать на одном графике:
x = np.arange(len(data[:50]))
width = 0.35
Для примера и в целях упрощения картинки возьмем первые 50 строк dataframe.
fig, ax = plt.subplots(figsize=(40,5))
rects1 = ax.bar(x - width/2, data['sepal width (cm)'][:50], width, label='sepal width')
rects2 = ax.bar(x + width/2, data['petal width (cm)'][:50], width, label='petal width')
ax.set_ylabel('cm')
ax.set_xticks(x)
ax.legend()
Используем методы seaborn
На мой взгляд, многие задачи по построению гистограмм проще и эффективнее выполнять с помощью методов seaborn (кроме того, seaborn выигрывает еще и своими графическими возможностями, на мой взгляд).
Я приведу пример задач, решающихся в seaborn с помощью одной строчки кода. Особенно seaborn выигрышный, когда надо построить распределение. Скажем, нам надо построить распределение длин чашелистиков. Решение этой задачи таково:
sns_plot = sns.distplot(data['sepal width (cm)'])
fig = sns_plot.get_figure()
Если же вам необходим только график распределения, сделать его можно так:
snsplot = sns.kdeplot(data['sepal width (cm)'], shade=True)
fig = snsplot.get_figure()
Подробнее о построении распределений в seaborn можно почитать тут.
Pandas-гистограммы
Здесь все просто. На самом деле, это оболочка matplotlib.pyplot.hist(), но вызов функции через pd.hist() иногда удобнее менее поворотливых конструкций matplotlib-a. В документации библиотеки pandas можно прочитать больше.
Работает это так:
h = data['petal width (cm)'].hist()
fig = h.get_figure()
Спасибо, что прочитали до конца! Буду рада отзывам и комментариям!
Визуализация данных в pandas для начинающих
В прошлой статье мы рассказали о том, как важно визуализировать данные в Data Science и Machine Learning. Также мы научились строить такие графики, как линейный, барный, диаграмму рассеяния, гистограмму и ящик с усами, в Python c библиотекой matplotlib. Сегодня мы покажем вам, как эти же самые графики могут быть построены в pandas без явного импортирования matplotlib, причем 3 разными способами. Предварительно отметим: pandas использует библиотеку matplotlib для визуализации, хотя в коде мы не будем ее импортировать, тем не менее она должна быть установлена. Если у вас ее нет, введите в командной строке:
pip install matplotlib
Продолжаем пробовать вино
В качестве примера возьмем тот же самый датасет Kaggle с отзывами о винных изделиях разных стран, который мы обсуждали ранее:
data = pd.read_csv('winemag-data-130k-v2.csv') data = data.drop(['description', 'title', 'Unnamed: 0'], axis=1) data.head()
Первые пять строк датасета выглядят следующим образом:
Отображение 5 первых строк в Pandas
Ключевыми атрибутами являются price – цена и points – балы. А теперь приступим к изучению визуализации данных в pandas.
Диаграмма рассеяния 1-м методом построения
В диаграмме рассеяния каждая точка одного атрибута соответствует каждой точке другого. 1-й метод построения заключается в том, что у DataFrame есть метод plot [1], одним из аргументов которого является kind, определяющий вид графика. И раз у нас точечный график, нужно указать scatter:
data.plot(x='points', y='price', kind='scatter')
Отметим, анализируемые атрибуты указываются как строки, по x
и y
. Pandas уже сам поймет, что именно строить, к тому же он еще и подпишет соответствующие оси:
Отобажение диаграммы рассеяния pandas
Линейный график
Линейный график строит переход от точки к точке. Построим такой график, где для каждого бала будем брать среднюю цену:
d = data.groupby('points').mean() d.plot()
Здесь, мы не указывали аргумент kind
, так как pandas по умолчанию строит именно линейный график. Результат:
Линейный график
Pandas даже предоставил легенду price на графике, что очень удобно, когда этих линий очень много.
Барный график 2-м методом построения
На барном графике каждая категория в виде бара имеет высоту, соответствующую числовому значению этой категории. Построим первые 7 стран по производству вина:
countries = data['country'].value_counts().head(7) countries.plot.bar()
2 метод построения – вызов конкретного графика через метод plot
. Таким образом, барный график будет выглядеть так:
Барный график
Подобным же образом можно вывести и другие вида графиков в Python:
data.plot.scatter() # диаграмма рассеяния data.plot.hist() # гистограмма
Заметим, у такого способа отсутствует возможность вызова boxplot
, поэтому для визуализации ящика с усами используется 1-й или 3-й способ.
Гистограмма 3-м методом построения
В машинном обучении плотности распределения служат хорошим инструментом анализа, особенно для линейных моделей. Например, плотность распределения остатков близкое к нормальному показывает, что на этих данных можно построить линейную регрессию. Гистограммы могут помочь с этим.
data.hist(column='points', bins=40, density=True)
Здесь указан 3-й способ получения графиков. DataFrame имеет методы hist
, bar
, scatter
и т.д., с которыми можно работать. Только нужно заметить, что метод hist
имеет аргументом column
, в которую передается необходимый столбец. Не указав его, pandas построит гистограммы для всех числовых атрибутов. Данная гистограмма выглядит вот так:
Отображение гистограммы pandas
Ящик с усами
В прошлый раз мы строили ящик с усами, показывающий размах данных, на всем наборе баллов датасета. Проделаем аналогичное через метод boxplot
(3-й метод):
data.boxplot(column='points')
Вид графика c теми же двумя выбросами представлен следующим образом:
Ящик с усами
Такая запись очень короткая, что очень в стиле Python. Лаконичный код позволяет не отвлекаться от основных дел – создания модели Machine Learning, например. Но стоит заметить, у DataFrame нет метода scatter
, поэтому для диаграммы рассеяния придется использовать только 1-й способ.
Подытожим способы построения диаграмм в Pandas:
- Метод plot у DataFrame, принимающий в качестве аргумента
kind
, который определяет вид графика. Например,data.plot(kind='bar')
построит барный график. Этим способом можно построить все вышеперечисленные графики.
- Вызов функции для построения hist, bar, line (линейный) через метод plot выглядит так:
data.plot.bar()
- Напрямую обратиться к bar, boxplot или hist можно через команду
data.bar()
Все примеры находятся в репозитории на github [2]. В следующей статье мы научимся работать с тензорами в numpy.
Визуализация данных без ее интерпретации может нести мало информации. В нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве мы поможем вам не только строить графики в Python, но и читать их.
Курс VIP: Визуализация данных на языке Python
Источники
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html
- https://github.com/DataLatata/python-school/blob/master/7pandas-figures/pandas-plots.ipynb
Pandas гистограмма df.hist() группа по — pandas
Как построить гистограмму с pandas DataFrame.hist() с помощью group by?
У меня есть фрейм данных с 5 столбцами: «A», «B», «C», «D» и «Group»
Есть две группы классов: «yes» и «no»
С помощью:
df.hist()
Я получаю hist для каждой из 4-х колонок.
Теперь я хотел бы получить те же 4 графика, но с синими полосами (группа=»yes») и красными полосами (группа = «no»).
Я попробовал это сделать с большим успехом:
df.hist(by = "group")
pandas
matplotlib
histogram
Поделиться
Источник
Hangon
25 августа 2017 в 14:25
2 Ответа
9
Использование Сиборна
Если вы открыты для использования Seaborn, график с несколькими подзаголовками и несколькими переменными внутри каждого подзаголовка можно легко создать с помощью seaborn.FacetGrid
.
import numpy as np; np.random.seed(1)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(300,4), columns=list("ABCD"))
df["group"] = np.random.choice(["yes", "no"], p=[0.32,0.68],size=300)
df2 = pd.melt(df, id_vars='group', value_vars=list("ABCD"), value_name='value')
bins=np.linspace(df2.value.min(), df2.value.max(), 10)
g = sns.FacetGrid(df2, col="variable", hue="group", palette="Set1", col_wrap=2)
g.map(plt.hist, 'value', bins=bins, ec="k")
g.axes[-1].legend()
plt.show()
Поделиться
ImportanceOfBeingErnest
25 августа 2017 в 22:39
8
Это не самый гибкий обходной путь, но он будет работать именно для вашего вопроса.
def sephist(col):
yes = df[df['group'] == 'yes'][col]
no = df[df['group'] == 'no'][col]
return yes, no
for num, alpha in enumerate('abcd'):
plt.subplot(2, 2, num)
plt.hist(sephist(alpha)[0], bins=25, alpha=0.5, label='yes', color='b')
plt.hist(sephist(alpha)[1], bins=25, alpha=0.5, label='no', color='r')
plt.legend(loc='upper right')
plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
Вы могли бы сделать это более общим путем:
- Добавление параметра
df
иby
вsephist
:def sephist(df, by, col)
- что делает цикл вложенных графиков более гибким:
for num, alpha in enumerate(df.columns)
Потому что первый аргумент к matplotlib.pyplot.hist
может принять
либо один массив, либо последовательность массивов, которые не требуются
быть одинаковой длины
..альтернативным вариантом будет::
for num, alpha in enumerate('abcd'):
plt.subplot(2, 2, num)
plt.hist((sephist(alpha)[0], sephist(alpha)[1]), bins=25, alpha=0.5, label=['yes', 'no'], color=['r', 'b'])
plt.legend(loc='upper right')
plt.title(alpha)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
Поделиться
Brad Solomon
25 августа 2017 в 14:58
Похожие вопросы:
pandas гистограмма в python. можно сделать вероятность / плотность вместо подсчета?
Гистограмма в pandas отображает количество каждого Бина, а не нормализованную долю. В R это опция в гистограмме. Возможно ли это в Pandas? Если нет, какие-либо рекомендации по простому обходному…
Python: Простая Гистограмма От DataFrame Пошла Наперекосяк
У меня есть Pandas DataFrame, который выглядит примерно так: pageviews type 0 48.0 original 1 181.0 licensed 2 50.0 original 3 17.0 original … Я хочу создать две гистограммы, одну для типа…
Pandas группа по времени windows
EDIT: генерация сеанса из анализа файла журнала с помощью pandas , похоже, именно то, что я искал. У меня есть dataframe, который включает в себя не уникальные метки времени, и я хотел бы…
Pivot каждая группа в Pandas
Используя Pandas я вызвал groupby на моем dataframe и получил следующее: >>>grouped = df.groupby([‘cid’]) for key, gr in grouped: print(key) print(gr) Out: cid price 121 12 121 10 121 9 Я…
pandas «stacked» гистограмма со значениями, не добавленными для определения высоты
Я пытаюсь отобразить гистограмму в pandas 0.18.1 , где значения для разных столбцов отображаются поверх друг друга, но не добавляются. Так что это, я думаю, сложенная гистограмма без stacking ,…
Matplotlib гистограмма появляется, а затем мгновенно исчезает
Я работаю над введением к pandas, и я застрял, чтобы получить гистограмму, чтобы появиться из набора данных, заданных. Вот мой код: import pandas import matplotlib matplotlib.use(‘TkAgg’)…
Numpy & Pandas: возвращает значения гистограммы из графика гистограммы pandas?
Я знаю, что могу построить гистограмму по pandas: df4 = pd.DataFrame({‘a’: np.random.randn(1000) + 1}) df4[‘a’].hist() Но как я могу получить подсчет гистограммы из такого графика? Я знаю, что могу…
Сгруппированная гистограмма Pandas
У меня есть стол в pandas DataFrame под названием df : +— ——+————+————-+———-+————+————+ |avg_views| avg_orders | max_views |max_orders| min_views…
pandas: plot гистограмма со временем на оси x
У меня есть Dataframe df , как это: Datetime Dollar 2009-08-01 00:00:00 87 2009-08-01 00:15:00 32 2009-08-01 00:30:00 19 2009-08-01 00:45:00 128 Если я попробую df.hist() , я получу только значения…
Частотный график в Python/Pandas DataFrame
У меня есть разбор очень большой dataframe с некоторыми значениями вроде этого и несколькими столбцами: Name Age Points … XYZ 42 32pts … ABC 41 32pts … DEF 32 35pts GHI 52 35pts JHK 72 35pts…
Синтаксис для параметров matplotlib в hist pandas — python
Согласно документам, метод pandas hist для создания dataframe может принимать параметр ax
, чтобы предположительно передать некоторые параметры построения в объект ax
. Я хочу знать, как я передаю эти параметры. Вот какой-то код:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.normal(0,100,size=(100, 2)), columns=['col1', 'col2'])
pd.DataFrame.hist(df,column='col1', ax={ylim(-1000,1000), set_title('new title')})
Приведенный выше код пытается изменить ограничения оси y и заголовок с помощью параметра ax
, но я не уверен в синтаксисе для использования.
python
pandas
matplotlib
Поделиться
Источник
Thomas Matthew
21 декабря 2017 в 05:40
1 Ответ
2
Это вывод hist()
, который создает объект Matplotlib Axes
.
Из документов plot()
:
Возвращает: оси : matplotlib.AxesSubplot или np.array из них
Вы можете использовать эту информацию, чтобы внести коррективы.
ax = df.col1.hist()
ax.set_title('new_title')
ax.set_ylim([-1000,1000])
Аргумент ax
внутри plot()
(и варианты, такие как hist()
) используется для построения графика на предопределенном элементе Axes. Например, можно использовать ax
из одного участка для наложения другого участка на ту же поверхность:
ax = df.col1.hist()
df.col2.hist(ax=ax)
Примечание: Я немного обновил ваш синтаксис. Вызовите hist()
как метод для самого фрейма данных.
ОБНОВЛЕНИЕ
Кроме того, вы можете передавать ключевые слова напрямую , но в этом случае вам (а) нужно вызвать plot.hist()
вместо просто hist()
, и (Б) ключевые слова передаются либо как kwargs
, либо непосредственно в строке. Например:
kwargs ={"color":"green"}
# either kwargs dict or named keyword arg work here
df.col1.plot.hist(ylim=(5,10), **kwargs)
Поделиться
andrew_reece
21 декабря 2017 в 06:08
Похожие вопросы:
Горизонтальные прямоугольники в matplotlib/Pandas
Барные участки: matplotlib предлагает функции bar и barh для построения вертикальных и горизонтальных полосовых графиков. Ящичковые диаграммы: matplotlib также предлагает функцию boxplot для…
Сохранить участок pandas matplotlib открыть после того, как код завершения
Я использую pandas встроенный график, как показано ниже. Однако, как только метод построения возвращается, сюжет исчезает. Как я могу держать сюжет(ы) открытым, пока я не нажму на них, чтобы…
Расстояние между прутками в matplotlib hist() с тысячами бункеров
Я делаю гистограммы, используя функцию hist() matplotlib или bar(), и я хочу использовать >10 000 ячеек (одна ячейка для представления отсчетов в каждой координате большого объекта). Есть ли способ…
Как сделать оси сетки невидимыми для pandas dataframe hist()?
Вот что я хочу сделать, гистограммы графиков всех столбцов a dataframe, но без осей сетки. Приведенный ниже код работает, но предпочтительно я хотел бы более элегантное решение (например, передача…
matplotlib hist(): веса должны иметь ту же форму, что и x, в то время как форма одинакова
Я пытаюсь построить гистограмму столбца в серии pandas (‘df_plot’). Поскольку я хочу, чтобы ось y была процентом (а не подсчетом), я использую опцию весов для достижения этого. Как видно из…
Использование функции astropy.visualization hist() вместо функции matplotlib hist()
Может кто-нибудь показать мне, как заменить функцию matplotlib hist() на функцию hist() из модуля astropy.visualization из следующего кода: Hist_SNR = plt.figure() Hist_SNR, ax = plt.subplots(3, 1,…
Как сделать гистограмму matplotlib/pandas похожей на гистограмму?
Построение различий между bar и hist Учитывая некоторые данные в A pandas.Series , rv , есть разница между Вызов hist непосредственно по данным на plot Вычисление результатов гистограммы (с…
маркировка конкретных ординат на pandas hist
У меня есть Pandas DataFrame, из которых я строю гистограмму подсчетов, используя DataFrame.hist(), например my_v[‘v’].hist(bins=50) Конечно, есть сетка, но я хотел бы добавить вертикальные линии…
Matplotlib subplot2grid построение IndexError в pandas 0.16.1
У меня есть (5) pandas серии, которые я пытаюсь построить на графиках (5). я хочу, чтобы они выглядели так, как этот формат с 5-й диаграммой в последней строке сам по себе, центрированный (не…
Построение гистограмм по классам в pandas / matplotlib
Существует ли идиоматический способ plot построить гистограмму признака для двух классов? В pandas, я в основном хочу df.feature[df.class == 0].hist() df.feature[df.class == 1].hist() Быть в том же…
matplotlib — гистограмма панд df.hist () сгруппирована по
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.Гистограмма
Python Pandas с фреймом данных
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира
.
Страница не найдена · GitHub Pages
Страница не найдена · GitHub Pages
Файл не найден
Сайт, настроенный по этому адресу, не
содержать запрошенный файл.
Если это ваш сайт, убедитесь, что регистр имени файла соответствует URL-адресу.
Для корневых URL (например, http://example.com/
) вы должны предоставить
index.html
файл.
Прочтите полную документацию
для получения дополнительной информации об использовании GitHub Pages .
.
matplotlib — Как добавить легенды и заголовок к сгруппированным гистограммам, созданным Pandas
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.