Сложенная или сгруппированная гистограмма на R и Python

#r #ggplot2 #bar-chart

#r #ggplot2 #гистограмма

Вопрос:

У меня есть огромный набор данных, которые я хочу отобразить либо на R, либо на python в виде сложенной или сгруппированной гистограммы. Давайте предположим, что это мои данные

 df<- data.frame(Continent= c("Asia","Africa","EU","US","Antractica"),
                Death= c(24242,75457,63521,967445,947),
                Cases= c(92332,338753,700346,8536856,4232) )
 

Во всех примерах, которые я видел об этих столбцах, всегда есть две категории и одно значение (например, хорошо известный алмаз или автомобиль, встроенный в набор данных в R), но для меня это не так. У меня есть strings значение (континент), а затем куча столбцов в виде dbl

приведенный ниже код дает мне вид результата, но я не удовлетворен

 p<- ggplot(df)  aes (x=Continent, y= Cases, fill= "Cases" )   geom_bar(stat="identity") 
    geom_bar(stat="identity",aes(y=Death, fill= "Death"))   ylab("All Covid Cases")
p
 

R создал график

это нормально, но легенда не совсем правильная (видна заливка вместо легенды), а также я не смог преобразовать ее в сгруппированную, указав postion="dodge" значение!
Я также пробовал Seaborn, но ни один из них не дает мне следующих изображений.
и я хочу получить такие графики
сгруппированныйили
 сложенная

Любые идеи будут оценены

Комментарии:

1. Привет! Был ли дан ответ на ваш вопрос? Если да, пожалуйста, примите ответ, чтобы будущие пользователи могли легко ссылаться на него.

Ответ №1:

В R общая идея состоит в том, чтобы получать данные в длинном формате, чтобы их было легко построить.

 library(ggplot2)
library(tidyr)

df %>%
  pivot_longer(cols= c(Death, Cases)) %>%
  ggplot()   aes(x=Continent, y= value, fill= name)  
  geom_col()
 

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

 df %>%
  pivot_longer(cols= c(Death, Cases)) %>%
  ggplot()   aes(x=Continent, y= value, fill= name)  
  geom_bar(stat = 'identity', position = 'dodge')
 

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

Ответ №2:

Вам необходимо преобразовать ваш фрейм данных из широкого в длинный. Проблема, с которой вы столкнулись, заключалась в том, что сложенные или сгруппированные диаграммы не могут быть окрашены числами, им нужна категория, чтобы их различать.

Когда мы melt data.table создаем фрейм данных с помощью пакета, он выглядит следующим образом:

     Continent  Death   Cases
1:       Asia  24242   92332
2:     Africa  75457  338753
3:         EU  63521  700346
4:         US 967445 8536856
5: Antractica    947    4232
 

Чтобы выглядеть так:

     Continent variable   value
 1:       Asia    Death   24242
 2:     Africa    Death   75457
 3:         EU    Death   63521
 4:         US    Death  967445
 5: Antractica    Death     947
 6:       Asia    Cases   92332
 7:     Africa    Cases  338753
 8:         EU    Cases  700346
 9:         US    Cases 8536856
10: Antractica    Cases    4232
 

После этого мы можем легко построить график.

Вот полный код:

 library(data.table)
#Define Dataset
df<- data.frame(Continent= c("Asia","Africa","EU","US","Antractica"),
                Death= c(24242,75457,63521,967445,947),
                Cases= c(92332,338753,700346,8536856,4232) )

# We will combine the counts into one column, and distinguish them by 
# Type in another column
df <- melt(setDT(df), id.vars = c("Continent"),measure.vars = c("Death", "Cases"))

#Lets Plot
ggplot(df, aes(factor(Continent), value, fill = variable))   
  geom_bar(stat="identity", position = "dodge")   
  scale_fill_brewer(palette = "Set1")  
  labs(title = "Cases and Deaths by Continent", x = "Continent", y = "Number", fill = "Type")
 

Ответ №3:

На самом деле все, что вам нужно barplot , это то, что поставляется с R. Нет необходимости прикасаться к данным.

 barplot(cbind(Death, Cases) ~ Continent, df, col=c("lightblue", "orange"),
        legend.text=names(df)[2:3])
 

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

 barplot(cbind(Cases, Death) ~ Continent, df, col=c("orange", "lightblue"), beside=T,
        legend.text=names(df)[3:2])
 

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