我的图表中有两个数据集,“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))
答案 0 :(得分:3)
问题在于你的功能getBaselineY
。我猜你用一个xValue
编写并测试了它。但是您将向量传递给函数并仅返回第一个值。
要按照描述的方式获取标签,请使用ifelse
:
diagram + geom_text(aes(label = ifelse(variable == "baseline", value,
value - value[variable == "baseline"])))