2017-10-17 14 views
1

J'ai fait une figure boxplot avec ggplot, mais je veux changer l'ordre de l'axe des y en fonction de l'ordre d'une colonne dans une autre dataframe que j'ai créée en utilisant des statistiques récapitulatives .Ordre boxgot ggplot de l'axe Y basé sur la colonne dataframe

Voici le script. Ci-dessous le script est une description de ma sortie désirée.

#data 
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"), 
      Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9), 
      Outliers = c(0, 0, 0, 0, 0, 1, 1, 0)) 

#data summary 
summary <- df %>% 
     group_by(City) %>% 
     summarise(Median = median(Time_Diff), 
     IQR = IQR(Time_Diff), 
     Outliers = sum(Outliers)) %>% 
     arrange(desc(Median), desc(IQR), desc(Outliers)) 

summary <- as.data.frame(summary) 


# Create ggplot object 
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots 

# Create boxplot figure 
bp + 
    geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph 
    coord_flip(ylim = c(0, 25)) + 
    geom_hline(yintercept = 4) + 
    ggtitle("Time Difference") + 
    ylab("Time Difference") + 
    xlab("City") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
    panel.border = element_blank(), #remove all border lines 
    axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line 
    axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) #add y-axis border line 

Je voudrais être l'ordre de l'axe y (x-axe basculée) être le même que l'ordre de la colonne dans la ville dataframe sommaire. Cela signifie:

De haut en bas: PAE, PAR, BER, NY, AMS

Toutes les suggestions efficaces et élégantes?

SOLUTION

Merci Prradep, j'ai utilisé votre solution pour le script et il fonctionne. Je l'ai légèrement ajusté, de sorte que je n'ai plus besoin de taper les valeurs de l'axe. J'ai réutilisé le vecteur City à partir de la base de données. Voici le script que je:

#data 
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"), 
      Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9), 
      Outliers = c(0, 0, 0, 0, 0, 1, 1, 0)) 

#data summary 
summary <- df %>% 
    group_by(City) %>% 
    summarise(Median = median(Time_Diff), 
     IQR = IQR(Time_Diff), 
     Outliers = sum(Outliers)) %>% 
    arrange(desc(Median), desc(IQR), desc(Outliers)) 

summary <- as.data.frame(summary) 

# Preproces data for figure 
order_city <- summary$City 

# Create ggplot object 
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots 

# Create boxplot figure 
bp + 
    geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph 
    coord_flip(ylim = c(0, 25)) + 
    geom_hline(yintercept = 4) + 
    ggtitle("Time Difference") + 
    ylab("Time Difference") + 
    xlab("City") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
    panel.border = element_blank(), #remove all border lines 
    axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line 
    axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis 
    scale_x_discrete(limits = rev(order_city)) #this is the function to change the order of the axis 

Répondre

1

Ajout scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS'))) ferait l'affaire.


Est-ce que vous cherchez:

# Create ggplot object 
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots 

# Create boxplot figure 
bp + 
    geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph 
    coord_flip(ylim = c(0, 25)) + 
    geom_hline(yintercept = 4) + 
    ggtitle("Time Difference") + 
    ylab("Time Difference") + 
    xlab("City") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
     panel.border = element_blank(), #remove all border lines 
     axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line 
     axis.line.y = element_line(size = 0.5, linetype = "solid",  colour = "black")) + #add y-axis border line 
    scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS'))) 

enter image description here

+0

Merci! J'ai utilisé une légère modification de votre code pour la solution finale. Voir mon problème pour le code – SHW