Python (matplotlib) эквивалент столбчатой диаграммы в R (ggplot)

#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')
)
  

Как и вывод:

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