2017-10-21 88 views
0

J'ai beaucoup de données pour lesquelles j'ai besoin de créer des graphiques à barres disposés par ordre décroissant. Si je le fais en dehors d'une fonction, les solutions illustrées dans ce post fonctionnent, mais pas lorsqu'elles sont utilisées dans la fonction.Tracer un graphique à barres de fréquence descendante à l'aide d'une fonction personnalisée avec ggplot2, dplyr et forcats

Voici un cas d'utilisation.

library(forcats) 
library(tidyverse) 

dat <- data.frame(
    x = rep(letters[1:5], times=c(3,11,8, 2, 7)) 
) 

plot_freq <- function(data, group, n=10){ 
    group <- enquo(group) 
    data %>% 
    count(!!group) %>% 
    top_n(n) %>% 
    mutate(group := fct_reorder(!!group, n)) %>% 
    ggplot(., aes_(group, quo(n))) + 
    geom_bar(stat = "identity") + 
    coord_flip() 
} 


plot_freq(dat, x, n=5) 

Que puis-je faire d'autre avec plot_freq qui peut me donner mon résultat désiré?

enter image description here

Répondre

1

Deux solutions.

plot_freq <- function(data, group, n=10){ 
    group <- enquo(group) 
    data %>% 
    count(!!group) %>% 
    top_n(n) %>% 
    mutate(group := fct_reorder(!!group, n)) %>% 
    ggplot(., aes_(y=quo(n))) + 
    geom_bar(aes(group),stat = "identity") + 
    coord_flip() 
} 

enter image description here

plot_freq <- function(data, group, n=10){ 
    group <- enquo(group) 
    data %>% 
    count(!!group) %>% 
    top_n(n) %>% 
    mutate(group := fct_reorder(!!group, n)) %>% 
    ggplot(., aes_(quo(group),quo(n))) + 
    geom_bar(stat = "identity") + 
    coord_flip() 
} 
+0

Je ne manquait seulement 'quo()' sur le '' group' dans ggplot'. Qu'est-ce qui se passait là-bas que cela a permis de réorganiser? – hpesoj626

+0

@ hpesoj626 Dans mon R 3.4.2 'aes (groupe, n)' fonctionne dans la fonction 'plot_freq'. Je ne comprends pas pourquoi ça ne marche pas pour toi. –

+0

hmm ... Je suis toujours en train d'enquêter. Mais c'est un problème pour un autre jour. En ce moment je peux être heureux que mon mal de tête soit fini. Et c'est seulement à cause d'un «quo()». Le passage à 'tidyeval' a raté beaucoup de mes fonctions personnalisées. Merci pour l'aide. – hpesoj626

2
dat %>% count(x) %>% top_n(5) %>% mutate(x = fct_reorder(x, n)) %>% 
    ggplot(., aes(x, n)) + geom_bar(stat = 'identity') + coord_flip() 

enter image description here

Vous pouvez modifier la fonction plot_freq en conséquence

changement group-quo(group), semblable à y esthétique:

plot_freq <- function(data, group, n=10){ 
    group <- enquo(group) 
    data %>% 
     count(!!group) %>% 
     top_n(n) %>% 
     mutate(group := fct_reorder(!!group, n)) %>% 
     ggplot(., aes_(x=quo(group), y=quo(n))) + 
     geom_bar(stat = "identity") + 
     coord_flip() 
} 

plot_freq(dat, x, n=5)