5

我正在尝试使用构面图绘制数据子集。它是 2 列 x4 行图。第一列的值介于 120 和 150 之间,第二列的值介于 180 和 250 之间,并且变量在数据文件中分配为较小或较大。我在将特定标签('120 <= greek symbol(alpha) <= 150'、'180 <= greek symbol(alpha) <= 250)添加到列变量(“Lesser”、“Greater”)时遇到问题. 我试着这样做:

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)

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

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 .. 提前谢谢你

4

3 回答 3

6

你想要的 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)

在此处输入图像描述

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

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

那么 labeller 函数和 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)

该图看起来相同。

于 2012-11-20T21:21:17.297 回答
0

我没有真正的答案,但我提出这个希望它有帮助。我的解决方案引发了一个错误,带有两个小于号,但可以使用一个,这让我觉得这是错误的行为。(编辑,请参阅下面的 Brian Diggs 评论或大概/希望在上面回答为什么这不是错误的。)

有效的示例数据,请注意,我在 twolabs 中用一个加号代替了一个小于号:

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,因为它的价值。有人可以更进一步吗?

于 2012-11-20T21:18:36.127 回答
0

我们没有要测试的数据(我们也没有您正在使用的代码),但先前的格子绘图经验告诉我,可能需要and中bquote的任何一个或某种组合。尝试 :sapplyas.expression

..., labels=c( bquote(120<.(alpha)~phantom()<150), bquote(180<.(alpha)~phantom()<250) )

在代码的第一部分中,我不认为您应该在expression内部使用,paste而是先构建标签,然后构建表达式向量。

如果你绝望了,你可以先构建情节,然后强制标签变得不同。如何使用网格编辑 ggplot2 对象以将数学表达式添加到构面标签?

于 2012-11-20T20:35:29.057 回答