plotnine / ggplot (Python) - составные столбики + ширина манипуляции - PullRequest
1 голос
/ 17 марта 2020

У меня есть этот фрейм данных:

df = pd.DataFrame({'Segment': {0: 'A', 1: 'B', 2: 'C', 3: 'D'},
 '%Value_S=0': {0: 0.489, 1: 0.429, 2: 0.467, 3: 0.461},
 '%Value_S=1': {0: 0.511, 1: 0.571, 2: 0.533, 3: 0.539},
 '%Total': {0: 0.148, 1: 0.076, 2: 0.3, 3: 0.477}})
df
    Segment  %Value_S=0  %Value_S=1  %Total
0   A        0.489       0.511       0.148
1   B        0.429       0.571       0.076
2   C        0.467       0.533       0.300
3   D        0.461       0.539       0.477

И я пытаюсь сделать столбец с накоплением, как этот:

enter image description here

Но мне нужно, чтобы ширина стержней была от %Total. Итак, чтобы построить график выше, я использовал это:

z = df.melt(id_vars="Segment", value_vars=["%Value_S=0", "%Value_S=1"])
(ggplot(z, aes(x="Segment", y="value")) + 
  geom_bar(aes(fill="variable"), stat="identity", position="fill"))

, и если я добавлю аргумент width:

geom_bar(aes(fill="variable", width= df["%Total"]), stat="identity", position="fill"))

Это даст мне эту ошибку:

PlotnineError: 'Aesthetics must either be length one, or the same length as the data'

Я попробовал и другой способ: сначала вычерчивая ширину, а затем я не могу найти способ построить две другие переменные. Самое сложное это: , четыре столбца должны покрывать ВСЕ график (без пробелов между ними). Есть идеи?

1 Ответ

0 голосов
/ 11 апреля 2020

Вы передали данные из расплавленного фрейма данных (z), но попытались отрегулировать ширину полосы по столбцу исходного фрейма данных (df). Вам нужно включить столбец %Total в расплавленный df:

z = df.melt(
    id_vars=["Segment", "%Total"],
    value_vars=["%Value_S=0", "%Value_S=1"]
)

, а затем просто сопоставить ширину с %Total столбцом:

from plotnine import geom_bar, ggplot, aes
(
    ggplot(z, aes(x="Segment", y="value"))
    + geom_bar(
        aes(fill="variable", width="%Total"),
        stat="identity", position="fill"
    )
)

, который производит:

enter image description here

...