r分数图表与分数

时间:2013-04-09 20:14:28

标签: r ggplot2 label plotmath

我想创建3个图,每个图包含来自不同数据框的2行图,然后用特定部分标记每个图。

例如,我有3个数据框:

df1 <- data.frame(x=c(1,2,3,4),y=c(2,3,4,5), z=c(3,3,6,8))
df2 <- data.frame(x=c(3,4,5,6),y=c(1,3,6,7), z=c(2,4,4,8))
df3 <- data.frame(x=c(1,2,2,3),y=c(2,5,6,9), z=c(2,5,6,7))

我想:

1)为每个数据框创建3个不同的图,每个图有一条红色和一条蓝线;

2)在每个图的蓝线上添加注释,每个图使用不同的分数。

例如,数据框1的图是这样的:

p1 <- ggplot(data = df1) + geom_line(aes(x=x,y=y, colour="blue")) + geom_line(aes(x=x,y=z, colour="red")) +  scale_colour_manual(name="data", values=c("red", "blue"))

然后在我试过的蓝线上添加标签:

p1 + geom_text(aes(x=df1$x[which.max(df1$y)]+1, y = max(df1$y)+4,  label = "{\frac{23 22 22}{44 28 32}}", size=2, parse=TRUE))

但这不起作用,我已经搜索了这么多个小时,无法找到如何在注释中使用分数(和括号中的括号)。非常感谢任何帮助!

-fra

1 个答案:

答案 0 :(得分:3)

目前尚不清楚你想拥有什么。这是一次尝试;

  • 我使用mapply循环绘制图表和分数并生成一个图表列表。
  • 我使用frac(x,y)
  • 创建分数
  • 我使用scale_y_continuous
  • 设置了地块的限制
  • 我使用gridExtra在同一个图中排列图(可选)

enter image description here

这里有完整的代码:

 ## a generic function that take a fraction ana a  data.frame as inputs
 ## it generate a plot
 plot.frac <- function(dat,frac){
     p <-  ggplot(dat) + 
           geom_line(aes(x=x,y=y, colour="blue")) + 
           geom_line(aes(x=x,y=z, colour="red")) +  
           scale_colour_manual(name="data", values=c("red", "blue"))+
           geom_text(x=dat$x[which.max(dat$y)]-0.05, y = max(dat$y)+4,  
                     label = frac, size=5,parse=TRUE)+
           ## Note the use of limits here to display the annotation 
           scale_y_continuous(limits = c(min(dat$y), max(dat$y)+5))
     p
    }
## create a list of data.frame of mapply    
df.list <- list(df1,df2,df3)
## ggplot2 use plotmath so  for fraction you use frac(x,y)
## here I construct the 2 terms using paste
frac.func <- function(num,den) paste('frac("',num,'","',den,'")',sep='')
num1 <- "line1:23 22 22"
den1 <- "line2: 44 28 32"
num2 <- "line1:23 50 22"
den2 <- "line2: 44 50 32"
num3 <- "line1:23 80 22"
den3 <- "line2: 44 80 32"
## create a list of fractions for mapply

frac.list <- list(frac.func(num1,den1),
              frac.func(num2,den2),
              frac.func(num3,den3))
frac.list <- list(frac,frac,frac)
## use mapply to call the plot over the 2 lists of data.frame and fractions
ll <- mapply(plot.frac,df.list,frac.list,SIMPLIFY=FALSE)
library(gridExtra)
do.call(grid.arrange,ll)