我正在创建一个带有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))
但是,这会产生两个问题:
我希望注释(点范围,段和文本)只出现在一个方面。我已经看到如何创建一个数据框来仅注释单个方面中的文本,但是想知道这是否可以用于段和点范围。
文本应为e1; 2,1; 2为下标 - 尽管是&#34 ;;&#34;在plotmath中导致错误。
答案 0 :(得分:1)
要完全按照你想要的方式制作情节可能会很困难,但通常最好不要把ggplot的细节搞得一团糟。所以我可以告诉你如何制作以下情节:
您使用gpgplot的方式并非如此(据我所知)打算使用。您正在为要绘制的每一行编写命令。但ggplot的想法是将所有数据放入数据框,然后将数据框的列映射到图形元素。您可能会发现以下资源很有用:ggplot2 page和Cookbook for R,您可以在其中找到ggplot2的大量优秀示例。
因此,第一步是准备数据,以便可以完成绘图。假设在您的示例中定义了test
,以下代码将适当地格式化数据:
library(reshape2)
plot.test <- melt(test,id=c("Age","facet"))
plot.test <- subset(plot.test,!is.na(value))
查看plot.test
和melt
的文档,以便更好地理解此步骤。第一行将数据放在不同的形状中。然后,每个曲线(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_line
和geom_point
都只需要调用一次。数据映射在ggplot
命令内完成。它表示变量Age
应该用作x轴,而变量value
(包含来自原始数据框的列e_12
等的数据)应该是用作y轴。列variable
列用于说明数据是来自e_12
,e_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轴的自定义,因为您似乎已经知道如何执行此操作。