2 votes

R : Comment construire un graphique à barres avec plusieurs barres et deux axes ?

Mon dataframe comporte 1 variable catégorielle et 3 variables numériques. Je veux construire un graphique à barres dans plotly R, où les variables 'action' et 'vente' seront données en barres et reflétées sur l'axe y de gauche tandis que la variable 'coût' sera visualisée par une ligne et les unités seront reflétées sur le second axe de droite. En outre, la couleur des barres doit être différente selon la colonne "modèle".

df <- data.frame (model  = c("A", "B", "C","D","E","F"),
                  share = c(12,20,15,9,60,20),
                  sale = c(16,25,18,14,67,28),
                  cost = c(14,19,28,24,57,28))

Sortie attendue ( Code ):

enter image description here

3voto

TarJae Points 9674

Mise à jour2 : Juste pour montrer comment vjust travaux :

ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 2)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_text(data = filter(df_long, name == "cost"), hjust=0, vjust=-6)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

Mise à jour avec un axe y secondaire et des numéros pour les points :

library(tidyverse)

df_long <- df %>% 
  pivot_longer(
    cols = -model
  )

ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 2)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_text(data = filter(df_long, name == "cost"), hjust=0, vjust=0)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

Première réponse : Quelque chose comme ça ?

  1. Apportez vos données en format long

  2. pour chaque barre et ligne filtrer les données

    library(tidyverse)

    df_long <- df %>% pivot_longer( cols = -model )

    ggplot() + geom_col(data = filter(df_long, name != "cost"), aes(x = model, y= value, fill=name), position = position_dodge())+ scale_fill_manual(values = c("blue", "grey"))+ geom_line(data = filter(df_long, name == "cost"), aes(x = model, y= value, color=name, group=1), size = 2)+ geom_point(data = filter(df_long, name == "cost"), aes(x = model, y= value), size = 2)+ scale_color_manual(values = "red")+ theme_minimal()+ theme(legend.title=element_blank())

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X