r ggplot2在单个方面注释点范围和段

时间:2015-04-28 17:09:21

标签: r ggplot2 facet

我正在创建一个带有ggplot的3方面图,其中包含以下数据

library(ggplot2)

test<-as.data.frame(c(1,2,3,4,1,2,3,4,1,2,3,4))
colnames(test)<-"e12"
test$e23<-c(NaN,NaN,NaN,NaN,2,3,4,5,2,3,4,5)
test$e34<-c(NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,3,4,5,6)
test$Age<-c(1,2,3,4,1,2,3,4,1,2,3,4)
test$facet<-c(1,1,1,1,2,2,2,2,3,3,3,3)

ggplot(test, aes(x=Age)) + 
  facet_grid( ~ facet) +
  geom_line(aes(y = e12), size=0.25, colour="red", linetype="dashed") +
  geom_point(aes(y = e12), size=2.5, shape=21, fill="red", colour=NA) +
  geom_line(aes(y = e23), size=0.25, colour="blue", linetype="dashed") +
  geom_point(aes(y = e23), size=2.5, shape=21, fill="blue", colour=NA) +
  geom_line(aes(y = e34), size=0.25, colour="green", linetype="dashed") +
  geom_point(aes(y = e34), size=2.5, shape=21, fill="green", colour=NA) +
  annotate("pointrange", x=3.05, y=6.1, ymin=6.1, ymax=6.1, colour="red", size=0.5) +
  annotate("segment", x=2.8, xend=3.4, y=6.1, yend=6.1, colour="red", size=0.5, linetype="dashed") +
  annotate("text", x=3.6, y=6.1, parse=T, label="e[1%;%2]", size=3.1, family="Calibri", colour="black") +
  theme(strip.text = element_text(face="bold", size=rel(1)),
        strip.background = element_rect(fill="white", colour="white", size=1)) +
  scale_x_continuous(limits=c(0.5,4.5), breaks=seq(1, 4, 1), minor_breaks=seq(1, 4, 1), expand = c(0, 0)) + 
  scale_y_continuous(limits=c(0,6.5), breaks=seq(0, 6.5, 1), minor_breaks=seq(0,6.5,0.2), expand = c(0, 0))

但是,这会产生两个问题:

  1. 我希望注释(点范围,段和文本)只出现在一个方面。我已经看到如何创建一个数据框来仅注释单个方面中的文本,但是想知道这是否可以用于段和点范围。

  2. 文本应为e1; 2,1; 2为下标 - 尽管是&#34 ;;&#34;在plotmath中导致错误。

  3. enter image description here

1 个答案:

答案 0 :(得分:1)

要完全按照你想要的方式制作情节可能会很困难,但通常最好不要把ggplot的细节搞得一团糟。所以我可以告诉你如何制作以下情节:

您使用gpgplot的方式并非如此(据我所知)打算使用。您正在为要绘制的每一行编写命令。但ggplot的想法是将所有数据放入数据框,然后将数据框的列映射到图形元素。您可能会发现以下资源很有用:ggplot2 pageCookbook for R,您可以在其中找到ggplot2的大量优秀示例。

因此,第一步是准备数据,以便可以完成绘图。假设在您的示例中定义了test,以下代码将适当地格式化数据:

library(reshape2)
plot.test <- melt(test,id=c("Age","facet"))
plot.test <- subset(plot.test,!is.na(value))

查看plot.testmelt的文档,以便更好地理解此步骤。第一行将数据放在不同的形状中。然后,每个曲线(e_12,e_23,e_34)不是一列,而是一列包含所有值,一列指示值所属的曲线。然后第二行抛弃所有未定义的值,这些值是不需要的。

现在数据准备就绪,可以按如下方式生成图表:

e.labs <- c(expression(e["1;2"]),expression(e["2;3"]),expression(e["3;4"]))

ggplot(plot.test,aes(x=Age,y=value,colour=variable)) +
  facet_grid(.~facet) +
  geom_line(size=0.25, linetype="dashed") + 
  geom_point(size=2.5) + 
  theme(strip.text = element_text(face="bold", size=rel(1)),
        strip.background = element_rect(fill="white", colour="white", size=1),
        legend.position=c(0.93,0.15)) +
  scale_colour_discrete(labels=e.labs)

如您所见,geom_linegeom_point都只需要调用一次。数据映射在ggplot命令内完成。它表示变量Age应该用作x轴,而变量value(包含来自原始数据框的列e_12等的数据)应该是用作y轴。列variable列用于说明数据是来自e_12e_23还是e_34列,用于设置不同的颜色。由于这些映射对于点和线是相同的,因此可以在ggplot()而不是geom_函数内部全局定义它们。

如果正确使用ggplot,即通过为图形对象分配列,则会自动生成图例。该代码仅包含两个用于自定义图例的语句:scale_colour_discrete用于更改图例中的标签,legend.position内的theme用于根据您的请求在图表上移动图例。

如果您还想用有意义的内容替换y轴标签和图例标题,可以使用labs功能。只需将以下内容添加到您的情节

+ labs(y="my y label",colour="my legend title")

我并不打算包含您对x轴和y轴的自定义,因为您似乎已经知道如何执行此操作。