ggplot2 / plotnine: Как построить сгруппированный график для расплавленного df? - PullRequest
1 голос
/ 17 января 2020

Я устанавливаю и расплавляю набор данных Airbnb и пытаюсь построить сгруппированный график:

from plotnine import *

airbnb_melted = pd.melt(airbnb_newcomers, id_vars =['host_id'], value_vars =['host_identity_verified', 'host_is_superhost']) 
print(airbnb_melted)

Расплавленный набор данных выглядит так:

enter image description here

Я знаю, что мой следующий код неверен, и вывод сюжета не тот, который я хочу, но он наиболее близок к моей идее:

ggplot(airbnb_melted, aes(x='variable', y='value')) +\
        geom_bar(stat = 'sum', position=position_dodge())

Я искал в Интернете и нашел много примеров сюжетов с y в качестве числовой переменной и stat='count', которые можно использовать. Однако y здесь является категоричным и показывает ошибку PlotnineError: 'stat_count() must not be used with a y aesthetic'

Как можно построить сгруппированную гистограмму, аналогичную следующему формату? Оранжевые слова - это то, что я добавил в качестве указания. Спасибо.

enter image description here

Обновления от 20 января 2020: благодаря помощи @StupidWolf кодирование работает следующим образом:

airbnb_host_count = airbnb_melted.replace(np.NaN, 'NA').groupby(['value', 'variable']).count().reset_index()

enter image description here

'host_id' фактически указывает здесь значения:

ggplot(airbnb_host_count, aes(x='variable', y='host_id', fill='value')) +\ 
    geom_bar(stat='sum', position=position.dodge())

enter image description here

1 Ответ

1 голос
/ 17 января 2020
Try this:

from plotnine import *
import pandas as pd
import numpy as np
import random

random.seed(99)
airbnb_melted = pd.DataFrame(
    {'host_id':np.arange(20),
     'variable': np.repeat(['host_identity_verified','host_is_superhost'],[10,10]) ,
     'value' : random.choices(['t','f','NA'],k=20)
    })

У меня нет вашего фрейма данных, поэтому проверьте, что именно является значением NA, и замените его следующим образом, например, если это NaN

airbnb_melted = airbnb_melted.replace(np.NaN,'NA')

Мы можем проверить счет:

airbnb_melted.groupby(['value','variable']).count()

value   variable    
NA  host_identity_verified  3
host_is_superhost   2
f   host_identity_verified  3
host_is_superhost   6
t   host_identity_verified  4
host_is_superhost   2

Теперь мы строим график, вы устанавливаете fill = 'value' и не устанавливаете 'stat', потому что по умолчанию установлено значение 'count', которое подсчитывает ваши t, f и NA:

ggplot(airbnb_melted, aes(x='variable', fill='value')) +\
        geom_bar(position=position_dodge())

enter image description here

...