使用aes_string时格式geom_text标签不起作用

时间:2014-06-18 18:43:16

标签: r ggplot2

我使用点功能来格式化使用ggplot2创建的绘图中的文本标签。这在使用aes时效果很好,但在使用aes_string时并不像预期的那样有效。是否有解决方法使其适用于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")))

3 个答案:

答案 0 :(得分:3)

您将字符串常量传递给dotdot("X2")返回"X2"。所以你基本上给aes_string论证label = "X2"

我让这个工作

ggplot(iris) + 
  geom_bar(aes(Species, Sepal.Width), stat = "identity") + 
  geom_text(data=df, aes_string(x="X1", y =180, label = deparse(dot(df$X2))))

Imgur

修改

根据MrFlick的建议,如果您需要将列名称作为字符串传递,也可以使用df[,"X2"]。即。

ggplot(iris) + 
  geom_bar(aes(Species, Sepal.Width), stat = "identity") + 
  geom_text(data=df, aes_string(x="X1", y =180, label = deparse(dot(df[,"X2"]))))

答案 1 :(得分:3)

不要只引用“X2”,而必须引用整个表达式

ggplot(iris) + 
  geom_bar(aes(Species, Sepal.Width), stat = "identity") + 
  geom_text(data=df, aes_string(x="X1", y =180, label = "dot(X2)"))

如果您想通过字符向量指定变量名称,可以使用paste()来构建该表达式。

答案 2 :(得分:2)

正如我的评论所暗示的那样,我不喜欢依赖deparse或其他评估技巧,除非我必须:

col <- "X2"
new_col <- paste0(col,"_dot")
df[,new_col] <- dot(df[,col])
ggplot(iris) + 
    geom_bar(aes(Species,Sepal.Width),stat="identity") + 
    geom_text(data=df,aes_string(x="X1",y=180,label=new_col))

我提出这个版本好像我们在函数中编写代码并且已经收到"X2"作为参数。