Горизонтальная гистограмма на море с числовыми c независимыми данными - PullRequest
1 голос
/ 10 июля 2020

Это Seaborn Do c о том, как создать горизонтальную коробчатую диаграмму. Вы заметите, что они используют некоторый набор данных, называемый сбоями, и строят график некоторой категориальной переменной в сравнении с некоторой числовой c переменной. Чтобы сделать его горизонтальным, они просто переворачивают переменные x и y, что достаточно легко.

Моя проблема в том, что мои категории - это numeri c, что вызывает проблемы. Минимальный воспроизводимый пример использует их набор данных. По сути, это должен быть один и тот же график, один по горизонтали, а другой по вертикали. Как видите, они оба вертикальные ...

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")


crashes = sns.load_dataset("car_crashes").sort_values("total", ascending=False)

crashes['roundTotal'] = np.round(crashes['total']).astype(int)
crashesMod = crashes.groupby(['roundTotal']).count().reset_index()
crashesMod['VsAverage'] = crashesMod['total'] > crashesMod.total.mean()

sns.barplot(x = 'roundTotal', y = 'total', hue = 'VsAverage', data = crashesMod)
plt.show()
sns.barplot(y = 'roundTotal', x = 'total', hue = 'VsAverage', data = crashesMod)

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

Я попытался создать столбец roundTotal из строки типа, так как я представлял, что он делает некоторые предположения под капотом и терпит неудачу с двумя типами numeri c, но затем я столкнулся с TypeError: unsupported operand type(s) for /: 'str' and 'int'

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Согласно документации seaborn, вы должны использовать опцию 'orient':

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")

fig, ax = plt.subplots(figsize=(3.5, 6))

crashes = (
    sns.load_dataset("car_crashes")
        .sort_values("total", ascending=False)
        .assign(roundTotal=lambda df: df['total'].round().astype(int).astype('category'))
        .groupby(['roundTotal']).count()
        .reset_index()
        .assign(VsAverage=lambda df: df['total'] > df['total'].mean())
        .pipe((sns.barplot, 'data'), y='roundTotal', x='total',
              hue='VsAverage', orient='horizonal', ax=ax)
)

ax.invert_yaxis()

И это дает мне:

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

2 голосов
/ 10 июля 2020

Просто добавьте это перед построением:

crashesMod.roundTotal=crashesMod.roundTotal.astype('category')
crashesMod.VsAverage=crashesMod.VsAverage.astype('category')
...