fonction - maitriser ggplot2




ggplot2 aes_string() ne gère pas les noms commençant par des nombres ou contenant des espaces (3)

Si les noms de colonne d'un data.frame sont démarrés avec des nombres ou comportent des espaces, aes_string() ne parvient pas à les gérer:

foo=data.frame("1st Col"=1:5, "2nd Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2])) + geom_point()
# Error in parse(text = x) : <text>:1:2: unexpected symbol
# 1: 1st
#     ^

foo=data.frame("First Col"=1:5, "Second Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2])) + geom_point()
# Error in parse(text = x) : <text>:1:7: unexpected symbol
# 1: First Col
#          ^

foo=data.frame("First_Col"=1:5, "Second_Col"=5:1, check.names=F)
bar=colnames(foo)
ggplot(foo, aes_string(x=bar[1],y=bar[2]))+geom_point()
# Now it works

Y at-il un moyen d'avoir des espaces dans les noms de colonnes, ou ils sont démarrés avec des nombres, et nous pouvons les utiliser dans ggplot2? Veuillez considérer que nous ne connaissons pas le nom de la colonne, donc évitez de fournir des exemples avec des noms de colonnes constants - quelque chose comme ci-dessous:

aes_string(x=`1st Col`, y=`2nd Col`)

Pour autant que je sache, cette méthode devrait fonctionner par programmation:

foo=data.frame("1st Col"=1:5, "2nd Col"=5:1, check.names=F)

#Save the colnames
bar=colnames(foo)

#change the names to something usable
names(foo) <- c("col1", "col2")

#Plot with arbitrary labs
ggplot(foo, aes(x=col1, y=col2)) + geom_point()+
  labs(x=bar[1], y=bar[2])


La question initiale demandait comment modifier une valeur d'une variable de sorte que ggplot () soit acceptable si la valeur n'est pas connue à l'avance.

Ecrire une fonction qui ajoute des back-ticks au début et à la fin de la valeur de la variable:

# ggName -> changes a string so it is enclosed in back-ticks.
#   This can be used to make column names that have spaces (blanks)
#   or non-letter characters acceptable to ggplot2.
#   This version of the function is vectorized with sapply.
ggname <- function(x) {
    if (class(x) != "character") {
        return(x)
    }
    y <- sapply(x, function(s) {
        if (!grepl("^`", s)) {
            s <- paste("`", s, sep="", collapse="")
        }
        if (!grepl("`$", s)) {
            s <- paste(s, "`", sep="", collapse="")
        }
    }
    )
    y 
}

Exemples:

ggname(12)

[1] 12

ggname("awk ward")

"` awk ward` "

l <- c("awk ward", "no way!")
ggname(l)

"` awk ward` "" `pas moyen!" "


Vous pouvez utiliser la fonction aes_string2 ci-dessous au lieu de aes_string :

aes_string2 <- function(...){
  args <- lapply(list(...), function(x) sprintf("`%s`", x))
  do.call(aes_string, args)
}






ggplot2