I am using the dot function to format text labels in a plot created with ggplot2
. This works fine when using aes
, but doesn't work like expected when using aes_string
. Is there a workaround to make it work with aes_string
?
require(ggplot2)
# Define the format function
dot <- function(x, ...) {
format(x, ..., big.mark = ".", scientific = FALSE, trim = TRUE)
}
# Create dummy data
df <- data.frame(cbind(levels(iris$Species),c(10000000000,200000,30000)))
df$X2 <- as.numeric(as.character(df$X2))
# Works with aes
ggplot(iris) +
geom_bar(aes(Species,Sepal.Width),stat="identity") +
geom_text(data=df,aes(x=factor(X1),y=180,label=dot(X2)))
# Doesn't work with aes_string
ggplot(iris) +
geom_bar(aes(Species,Sepal.Width),stat="identity") +
geom_text(data=df,aes_string(x="X1",y=180,label=dot("X2")))
You're passing a string constant to
dot
anddot("X2")
returns"X2"
. So you're basically givingaes_string
the argumentlabel = "X2"
.I got this to work
Edit
As suggested by MrFlick, you could also use
df[,"X2"]
if you need to pass the column name as a string. I.e.As implied by my comment, I dislike relying on
deparse
or other evaluation tricks unless I have to:I presented this version as if we were writing code in a function and had received the
"X2"
as an argument.Rather than just quote "X2", you must quote the whole expression
If you wanted to specify variable names via a character vector, you would use
paste()
to build that expression.