用R标注刻面

时间:2012-11-20 19:14:35

标签: r labels facet

我正在尝试使用构面图绘制数据子集。它是2列x4行图。第一列的值介于120和150之间,第二列的值介于180和250之间,变量在数据文件中指定为较小或较大。我面临着添加特定标签(' 120< =希腊符号(alpha)< = 150',' 180< =希腊符号(alpha)< = 250)的问题列变量("较小","大")。我试着这样做:

require(graphics)
library(ggplot2)
hp <- ggplot2(data) + ....
xlow <- paste("120 <", expression(alpha), " < 150") 
xhi <- paste("180 <", expression(alpha), " < 250")
mf_labeller <- function(var, value){
  value <- as.character(value)
  if (var=="regime") {
  value[value=="Lesser"] <- xlow
  value[value=="Greater"]  <- xhi
}
  return(value) 
}
(hp %+% data) + facet_grid(param~regime,  scales="free", labeller=mf_labeller)

我得到&#34;错误值==&#34;更大&#34; :表达式不允许比较&#34;。我也尝试过强制数据。如果我以任何方式进行标记:

data2 <- transform(data, regime = factor(regime, levels=c("Lesser", "Greater"), labels=c(expression(paste("120 <", alpha," < 150")), expression("180 < alpha < 250"))))

我逐字逐句得到整个表达式,而不是所需的情节。我可能会遗漏一些东西。 任何帮助真的很感激!! 提前谢谢..

我的样本摘录是:

regime,param,line,XX,Var,sner
Lesser,Rise,VII,AA,4.968624,0.1275248
Lesser,Rise,VII,BB,3.719405,0.08470305
Lesser,Rise,VII,CC,7.608773,0.177848
Lesser,Rise,VII,DD,9.874395,0.1367159
Lesser,Text,VII,AA,4.968624,0.1275248
Lesser,Text,VII,BB,3.719405,0.08470305
Lesser,Text,VII,CC,7.608773,0.177848
Lesser,Text,VII,DD,9.874395,0.1367159
Lesser,Chant,VII,AA,0.1771826,0.186758
Lesser,Chant,VII,BB,0.3611497,0.5484656
Lesser,Chant,VII,CC,0.7719002,0.8864444
Lesser,Chant,VIII,DD,1.829022,0.2639881
Greater,Rise,VII,AA,4.968624,0.1275248
Greater,Rise,VII,BB,3.719405,0.08470305
Greater,Rise,VII,CC,7.608773,0.177848
Greater,Rise,VII,DD,9.874395,0.1367159
Greater,Text,VII,AA,4.968624,0.1275248
Greater,Text,VII,BB,3.719405,0.08470305
Greater,Text,VII,CC,7.608773,0.177848
Greater,Text,VII,DD,9.874395,0.1367159
Greater,Chant,VII,AA,0.1771826,0.186758
Greater,Chant,VII,BB,0.3611497,0.5484656
Greater,Chant,VII,CC,0.7719002,0.8864444
Greater,Chant,VIII,DD,1.829022,0.2639881

和我使用的代码:我在帖子中以错误的方式写了早期的表达式,但我确实在代码中使用了正确的表达式。

x <- read.table("sample.csv", header=T, sep=',')
require(graphics)
library(ggplot2)
ppi <- 300
png("figure.png", width=6*ppi, height=6*ppi, res=ppi)
hp <- ggplot(data=x,aes(x=XX, y=Var, colour=line, group = line)) + geom_errorbar(aes(ymin=Var-sner, ymax=Var+sner, colour=line), width=.3) + geom_line(aes(ymax=Var+sner), size=0.7) + geom_point(aes(ymax=Var+sner), shape=21, size=2,fill="white") + theme_bw() + theme(axis.text.x = element_text(angle=90,vjust=0.25), panel.grid.minor=element_blank(), panel.grid.major=element_blank(), panel.background =element_blank(), legend.position="none" ) + scale_colour_hue(l=40) 
xlow <- expression(paste("120 <",alpha," < 150"))
xhi <- expression(paste("180 <", alpha," < 250"))
.. earlier code block as alternative here...
data2 <- transform(x, regime = factor(regime, levels=c("Lesser", "Greater"), labels=c( bquote(120<.(alpha)~phantom()<150), bquote(180<.(alpha)~phantom()<250) )
(hp %+% data2) + facet_grid(param~regime,  scales="free", labeller=label_bquote)

我之前和mf_labeller一样试过.. 提前谢谢

3 个答案:

答案 0 :(得分:5)

plotmath表达式所需的表单是

expression(120 <= alpha~phantom() <= 150)
expression(180 <= alpha~phantom() <= 250)

你可以通过这种方式或通过

间接获得
parse(text="120 <= alpha~phantom() <= 150")
parse(text="180 <= alpha~phantom() <= 250")

最简单的方法是将因子的级别设置为这些字符串并使用label_parsed函数。

使用mtcars数据进行模拟,因为您没有提供可重现的示例:

dat <- mtcars   
dat$regime <- factor(dat$am)
levels(dat$regime) <- list("120 <= alpha~phantom() <= 150" = "0",
                           "180 <= alpha~phantom() <= 250" = "1")

ggplot(aes(x=wt, y=mpg), data=dat) +
  geom_point() +
  facet_grid(cyl ~ regime, labeller=label_parsed)

enter image description here

如果您真的想使用自己的贴标机,并且不想更改基础数据的因子级别,那么您也可以这样做。从具有“较小”和“较大”级别的模拟数据开始:

dat <- mtcars   
dat$regime <- factor(dat$am, levels=c(0,1), labels=c("Lesser", "Greater"))

然后贴标签函数和ggplot代码将是:

mf_labeller <- function(var, value){
  value <- as.character(value)
  if (var=="regime") {
    value[value=="Lesser"] <- "120 <= alpha~phantom() <= 150"
    value[value=="Greater"]  <- "180 <= alpha~phantom() <= 250"
    value <- lapply(value, function(x) parse(text=x))
  }
  return(value) 
}

ggplot(aes(x=wt, y=mpg), data=dat) +
  geom_point() +
  facet_grid(cyl ~ regime, labeller=mf_labeller)

图表看起来一样。

答案 1 :(得分:0)

我们没有您的数据进行测试(我们也没有您正在使用的代码),但之前的格子绘图经验告诉我bquotesapply和{的某种组合可能需要{1}}。试试:

as.expression

在代码的第一部分中,我不会认为您应该在..., labels=c( bquote(120<.(alpha)~phantom()<150), bquote(180<.(alpha)~phantom()<250) ) 内使用expression,而是首先构建标签然后构建表达式向量。

如果你绝望,你可以先建立情节,然后强制标签不同。 How can I use grid to edit a ggplot2 object to add math expressions to facet labels?

答案 2 :(得分:0)

我没有真正的答案,但我希望这有用,希望它有所帮助。我的解决方案抛出两个小于标志的错误,但与一个一起工作,这让我感到错误。 (编辑,请参阅下面的Brian Diggs评论,或者大概/希望在上面回答为什么这不是错误的。)

有效的样本数据,请注意我用一个加号代替少于两个的加号:

twolabs  <- c("120<alpha+150","150<alpha+250")
df<- data.frame(x=rnorm(mean=4,40),
   y=rnorm(mean=4,40),
   labs=sample(twolabs,40,replace=T))

这个情节非常有效。

ggplot(df,aes(x=x,y=y))+geom_point()+facet_grid(.~labs,labeller=label_parsed)

但是,带有两个小于标志的数据会引发错误:

twolabs  <- c("120<alpha<150","150<alpha<250")
df2<- data.frame(x=rnorm(mean=4,40),
   y=rnorm(mean=4,40),
   labs=sample(twolabs,40,replace=T))

> ggplot(df2,aes(x=x,y=y))+geom_point()+facet_grid(.~labs,labeller=label_parsed)
Error in parse(text = x) : <text>:1:10: unexpected '<'
1: 120<alpha<

通过使用label_parsed,我认为我们最终会调用gridDevices :: plotmath来获取它的价值。有人可以接受这个吗?