#python #r #matplotlib #ggplot2
#python #r #matplotlib #ggplot2
Вопрос:
Я ищу эквивалент в python (matplotlib) следующей столбчатой диаграммы с накоплением, созданной в R (ggplot):
Фиктивные данные (в R) выглядят следующим образом:
seasons <- c("Winter", "Winter", "Winter", "Spring", "Spring", "Spring", "Summer", "Summer", "Summer", "Fall", "Fall", "Fall")
feelings <- c("Cold", "Cold", "Cold", "Warm", "Warm", "Cold", "Warm", "Warm", "Warm", "Warm", "Cold", "Cold")
survey <- data.frame(seasons, feelings)
В R я могу создать диаграмму, которую я ищу, со следующим однострочным:
ggplot(survey, aes(x=seasons, fill=feelings)) geom_bar(position = "fill")
Это выглядит так:
Как я могу создать эту диаграмму на python (желательно с помощью matplotlib) простым и компактным способом?
Я нашел несколько (почти) подходящих решений, но все они были довольно сложными и далеки от однострочных. Или это невозможно в python (matplotlib)?
Комментарии:
1. Вы проходили через это matplotlib.org/3.1.1/gallery/lines_bars_and_markers /… ?
2. Да, но это на самом деле не помогло мне с моей проблемой.
Ответ №1:
Шаг 1. Подготовьте свои данные
df = pd.DataFrame(
{
"seasons":["Winter", "Winter", "Winter", "Spring", "Spring", "Spring", "Summer", "Summer", "Summer", "Fall", "Fall", "Fall"],
"feelings":["Cold", "Cold", "Cold", "Warm", "Warm", "Cold", "Warm", "Warm", "Warm", "Warm", "Cold", "Cold"]
}
)
df_new = df.pivot_table(columns="seasons", index="feelings", aggfunc=len, fill_value=0).T.apply(lambda x: x/sum(x), axis=1)
df_new
feelings Cold Warm
seasons
Fall 0.666667 0.333333
Spring 0.333333 0.666667
Summer 0.000000 1.000000
Winter 1.000000 0.000000
Шаг 2. Постройте свои данные
ax = df_new.plot.bar(stacked=True)
ax.set_xticklabels(ax.get_xticklabels(), rotation=0)
plt.style.use('ggplot')
plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5), title="feelings", framealpha=0);
Комментарии:
1. Большое вам спасибо. Это действительно создало бы тот же график. Но, возможно, я недостаточно четко сформулировал свой вопрос. В matplotlib (или любом другом пакете python) нет способа создать аналогичный график коротким и простым способом (однострочный), как в ggplot в R? Другими словами, действительно ли необходимо писать так много кода для такого графика, и поэтому вы бы порекомендовали использовать ggplot / R поверх python для такой цели?
2. Вам необходимо подготовить данные и график. Это самый короткий способ достичь того, чего вы хотите. не менее 2 строк. R и Python разные. Вы должны выбрать то, что вам подходит
Ответ №2:
Если вы не женаты на matplotlib и действительно предпочитаете ggplot, то вы можете просто использовать plotnine
библиотеку, которая является клоном ggplot в Python. Синтаксис почти идентичен:
import pandas as pd
from plotnine import *
survey = pd.DataFrame({
'seasons': ['Winter', 'Winter', 'Winter', 'Spring', 'Spring', 'Spring', 'Summer', 'Summer', 'Summer', 'Fall', 'Fall', 'Fall'],
'feelings': ['Cold', 'Cold', 'Cold', 'Warm', 'Warm', 'Cold', 'Warm', 'Warm', 'Warm', 'Warm', 'Cold', 'Cold'],
})
(
ggplot(survey, aes(x='seasons', fill='feelings'))
geom_bar(position = 'fill')
)
Как и вывод: