R, макет: Как определить ширину частей области черчения, чтобы центрировать заголовок? - PullRequest
2 голосов
/ 30 марта 2012

Я бы хотел центрировать заголовок относительно матрицы графика (а не общего графика), которую я создал с помощью этого кода:

d <- 3
d2 <- d*d
layout.mat <- matrix(1:d2, byrow=TRUE, ncol=d) # plot matrix
layout.mat <- cbind(layout.mat, rep(0, d)) # space
layout.mat <- cbind(layout.mat, rep(d2+1, d)) # column on the right side
wspace <- 6*par("csi")*2.54 # width of the space in character height in cm
wside <- 3*par("csi")*2.54 # width of the right side in character height in cm
layout(layout.mat, respect=TRUE, widths=c(rep(1, d), lcm(wspace), lcm(wside)))
layout.show(d2+1)
par(mar=rep(0, 4), oma=c(4,4,6,4))
for(i in 1:d){
    for(j in 1:d){
        plot.new()
        plot.window(xlim=c(0,1), ylim=c(0,1))
        ll <- par("usr")
        rect(ll[1], ll[3], ll[2], ll[4])
        text(0.5, 0.5, paste("i=",i,", j=",j,sep=""), cex=1.4)
    }
}
plot.new()
plot.window(xlim=c(0,1), ylim=c(0,1))
ll <- par("usr")
rect(ll[1], ll[3], ll[2], ll[4])
text(0.5, 0.5, "side", cex=1.4)

## title
mtext("This title should be centered according to the plot matrix", side=3,
      line=2, outer=TRUE, adj=0.5, at=0.5)

Как определить (при заданных фиксированных расстояниях wspace и wside) ширину области графика, чтобы можно было вычесть из нее wspace+wside, чтобы определить ширину матрицы графика? Конечная цель состоит в том, чтобы определить точное значение для adj из mtext так, чтобы заголовок находился по центру над матрицей графика, а не по всей области построения.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Как насчет добавления этого кода в ваш for цикл:

if (i == 1 & j == 2){
   mtext("This title should be centered according to the plot matrix", side=3,
        line=2, outer=FALSE, adj=0.5, at=0.5)
}

Обратите внимание на изменение outer = FALSE. Вот как это выглядит, с более коротким текстом заголовка (длинная версия проходит по обе стороны на небольшом графике, но все еще в центре):

enter image description here

Конечно, этот хак работает, только если у вас нечетное количество столбцов. Более общее решение может состоять в том, чтобы изменить макет, включив в него короткую широкую горизонтальную область вверху, и непосредственно нанести текст в этой области:

d <- 4
d2 <- d*d
layout.mat <- matrix(1:d2, byrow=TRUE, ncol=d) # plot matrix
layout.mat <- cbind(layout.mat, rep(0, d)) # space
layout.mat <- cbind(layout.mat, rep(d2+1, d)) # column on the right side
layout.mat <- rbind(c(rep(18,d),0,0),layout.mat) #Add row on top
wspace <- 6*par("csi")*2.54 # width of the space in character height in cm
wside <- 3*par("csi")*2.54 # width of the right side in character height in cm
#Note adjustments to heights
layout(layout.mat, respect=TRUE, widths=c(rep(1, d), lcm(wspace), lcm(wside)),
       heights = c(0.25,rep(1,nrow(layout.mat)-1)))
layout.show(d2+1)
par(mar=rep(0, 4), oma=c(4,4,6,4))
for(i in 1:d){
    for(j in 1:d){
        plot.new()
        plot.window(xlim=c(0,1), ylim=c(0,1))
        ll <- par("usr")
        rect(ll[1], ll[3], ll[2], ll[4])
        text(0.5, 0.5, paste("i=",i,", j=",j,sep=""), cex=1.4)
    }
}
plot.new()
plot.window(xlim=c(0,1), ylim=c(0,1))
ll <- par("usr")
rect(ll[1], ll[3], ll[2], ll[4])
text(0.5, 0.5, "side", cex=1.4)

## title
plot.new()
plot.window(xlim=c(0,1), ylim=c(0,1))
ll <- par("usr")
#rect(ll[1], ll[3], ll[2], ll[4])
text(0.5, 0.5, "top", cex=1.4)

enter image description here

1 голос
/ 30 марта 2012

Возможно, вы захотите взглянуть на функции grconvertX и grconvertY. Их можно использовать для преобразования между различными системами координат. Вы можете использовать это, чтобы найти координаты устройства, соответствующие правому и левому краям областей построения или рисунка, а затем использовать эту информацию, чтобы решить, куда поместить общий заголовок.

Вот пример одного из способов сделать это. Приятной особенностью этого является то, что его можно запускать после любой из команд печати (вам не нужно создавать и настраивать окончательную область графика сверху, а помещать текст в области полей.

#  left edge of matrix
l.x <- grconvertX(0, from='nic')
# right side of matrix (right side of inner minus wspace and wside)
r.x <- grconvertX(grconvertX(1, from='nic', to='inches') - (wspace+wside)/2.54,
    from='inches')

# find 2 line heights from top
t.y <- grconvertY(1, from='ndc') - 2*strheight('Test text')
# or 2 line heights above inner margin
t.y <- grconvertY(1, from='nic') + 2*strheight('Test text')


par(xpd=NA)
text( (l.x+r.x)/2, t.y, 'Test text' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...