ggplot2使用running变量来设置geom_text标签

时间:2014-05-05 10:36:04

标签: r ggplot2

我的图表中有两个数据集,“y1”和“baseline”。作为ggplot图中的标签,我想使用两者的y值的差异。我想在飞行中为此提供便利。

数据帧:

df <- data.frame(c(10,20,40),c(0.1,0.2,0.3),c(0.05,0.1,0.2))
names(df)[1] <- "classes"
names(df)[2] <- "y1"
names(df)[3] <- "baseline"
df$classes <- factor(df$classes,levels=c(10,20,40), labels=c("10m","20m","40m"))
dfm=melt(df)

首先,我定义了一个函数,它返回对应于特定x值的基线的y值:

经过测试,工作正常:

getBaselineY <- function(xValue){
  return(dfm[dfm$classes==xValue & dfm$variable=="baseline",]$value[1])
}

不幸的是,将此函数解析为ggplot代码只能给出第一个x值的基线y值:

diagram <- ggplot(dfm, aes(x=classes, y=value, group=variable, colour=variable))
diagram <- diagram + geom_point() + geom_line()
diagram <- diagram + geom_text(aes(label=getBaselineY(classes)))
diagram <- diagram + theme_bw(base_size=16)
diagram

然而,仅通过x值对函数调用进行子集化就可以得到每个ggplot迭代的相应x值:

diagram <- diagram + geom_text(aes(label=classes))

我不明白这是怎么来的,以及如何以最佳方式解决它。任何帮助都非常感谢!

或者,这可以通过事先计算差异并在数据框中添加其他列来解决:

df$Difference<-df$y1-df$baseline
dfm=melt(df,id.var=c(1,4))

直接将其用作geom_text标签:

diagram <- diagram + geom_text(aes(label=Difference))

1 个答案:

答案 0 :(得分:3)

问题在于你的功能getBaselineY。我猜你用一个xValue编写并测试了它。但是您将向量传递给函数并仅返回第一个值。

要按照描述的方式获取标签,请使用ifelse

diagram + geom_text(aes(label = ifelse(variable == "baseline", value, 
      value - value[variable == "baseline"])))

enter image description here