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:

  1. Метод plot у DataFrame, принимающий в качестве аргумента kind, который определяет вид графика. Например,
    data.plot(kind='bar')
    

    построит барный график. Этим способом можно построить все вышеперечисленные графики.

  2. Вызов функции для построения hist, bar, line (линейный) через метод plot выглядит так:
    data.plot.bar()
    
  3. Напрямую обратиться к bar, boxplot или hist можно через команду
    data.bar()
    

Все примеры находятся в репозитории на github [2]. В следующей статье мы научимся работать с тензорами в numpy.

Визуализация данных без ее интерпретации может нести мало информации. В нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве мы поможем вам не только строить графики в Python, но и читать их.

Курс VIP: Визуализация данных на языке Python

Источники

  1. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html
  2. 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 () сгруппирована по

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.Гистограмма

Python Pandas с фреймом данных

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
.

Страница не найдена · GitHub Pages

Страница не найдена · GitHub Pages

Файл не найден

Сайт, настроенный по этому адресу, не содержать запрошенный файл.

Если это ваш сайт, убедитесь, что регистр имени файла соответствует URL-адресу.
Для корневых URL (например, http://example.com/ ) вы должны предоставить index.html файл.

Прочтите полную документацию для получения дополнительной информации об использовании GitHub Pages .

.

matplotlib — Как добавить легенды и заголовок к сгруппированным гистограммам, созданным Pandas

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa