【问题标题】:Title key on each panel of a plot generated with par(mfrow=c(x,y))使用 par(mfrow=c(x,y)) 生成的绘图的每个面板上的标题键
【发布时间】:2013-11-10 11:51:40
【问题描述】:

为了在科学出版物中使用,我想在使用 par(mfrow=c(3,1)) 生成的一个图中添加一个键(A、B、C)作为“标题”到三个图。 为单个绘图添加漂亮的“标题”键的一个非常简单的解决方案是使用标题()的“外部”参数(例如title(outer=T,adj=0,main="A",cex=1.1, col="black",font=2,line=-1))但是当这将用于多个绘图时,所有标题最终都在同一个地方:

par(mfrow=c(3,1))
plot(rnorm(100),col="red")
title(outer=T,adj=0,main="A",cex=1.1,col="black",font=2,line=-1)
plot(rnorm(100),col="blue")
title(outer=T,adj=0,main="B",cex=1.1,col="black",font=2,line=-1)
plot(rnorm(100),col="green")
title(outer=T,adj=0,main="C",cex=1.1,col="black",font=2,line=-1)

我知道我可以使用布局和/或多行文本 (Common main title of a figure panel compiled with par(mfrow)) 但是我觉得可能有一个我忽略的更简单的解决方案(我没有访问 Adob​​e Illustrator 并希望使用 R 来生成完整的图表)。 我可以使用布局得到的解决方案不够好(键与情节分离太多,左侧不够),而且我发现玩弄边距和坐标有点太乏味了。

par(mar=c(1,2,2,1))
layout(matrix(seq(1,6),ncol=1),heights=rep(c(1,3),3))
plot.new()
text(0,0.5,"A",cex=1.1,font=2)
plot(rnorm(100),col="red")
plot.new()
text(0,0.5,"B",cex=1.1,font=2)
plot(rnorm(100),col="blue")
plot.new()
text(0,0.5,"C",cex=1.1,font=2)
plot(rnorm(100),col="blue")

任何帮助将非常感激。即使答案是这根本不可能以简单的方式实现,这仍然非常有帮助。

【问题讨论】:

    标签: r plot


    【解决方案1】:

    当您使用outer=TRUE 时,您要求将标题写在外边距(所有子图通用)。做你想做的事,只需设置outer=FALSE:

    outer = FALSE
    
    line = -2
    cex = 2
    adj  = 0.025
    
    par(mfrow=c(3,1))
    plot(rnorm(100),col="red")
    title(outer=outer,adj=adj,main="A",cex.main=cex,col="black",font=2,line=line)
    plot(rnorm(100),col="blue")
    title(outer=outer,adj=adj,main="B",cex.main=cex,col="black",font=2,line=line)
    plot(rnorm(100),col="green")
    title(outer=outer,adj=adj,main="C",cex.main=cex,col="black",font=2,line=line)
    

    另外,如果您希望标签在侧面,您可以使用mtext 而不是title

    line = 6
    cex = 2
    las = 2
    
    par(mfrow=c(3,1), oma=c(1,6,1,1))
    
    plot(rnorm(100),col="red")
    mtext("A", side=2, line=line, cex=cex, las=las)
    plot(rnorm(100),col="blue")
    mtext("B", side=2, line=line, cex=cex, las=las)
    plot(rnorm(100),col="green")
    mtext("C", side=2, line=line, cex=cex, las=las)
    

    将标签放在角落的另一种选择是:

    line = 1
    cex = 2
    side = 3
    adj=-0.05
    
    par(mfrow=c(3,1), oma=c(1,6,1,1))
    
    plot(rnorm(100),col="red")
    mtext("A", side=side, line=line, cex=cex, adj=adj)
    plot(rnorm(100),col="blue")
    mtext("B", side=side, line=line, cex=cex, adj=adj)
    plot(rnorm(100),col="green")
    mtext("C", side=side, line=line, cex=cex, adj=adj)
    

    adj 可以使用负值。

    【讨论】:

    • 我很欣赏这个想法,但上面的虚拟数据不是我将在我的出版物中使用的图(我将使用来自 vegan 的 rarecurve 函数的稀疏图,我稍作调整)。我的地块有禁止左上角(逻辑位置)字母的水平线。因此,如果可行的话,我希望它们位于每个单独地块的外边缘。
    • @FMKerckhof 没问题,只要使用这个答案,但设置line = 2 而不是line = -2
    • @shujaa 关键问题是我想在图的一侧而不是在顶部标记每个图。因此,我希望它位于 y 轴上方,甚至位于 y 轴标签上方,甚至更靠左(在外边距中)。这里给出了一个(不完美的)示例:dropbox.com/s/xragh9g5ng4w4hh/combi%201.svg。但现在我将使用里卡多的答案。
    • @FMKerckhof:我没有从问题中得到答案,我正在编辑答案。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多