可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I generate the following legend:
legend(
"bottomleft"
, legend=c(
expression(bold("Long:" ~ (w==10^2 ~ ";" ~ h==10^5)))
, expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)
, expression(bold("Wide:" ~ (w==10^3 ~ ";" ~ h==10^3)))
, expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)
)
, col=c("n", 1, 2, 3, 4, 5, -1, 1, 2, 3, 4, 5)
, lty=c(F, 1, 1, 1, 1, 1, -1, 2, 2, 2, 2, 2)
, cex=.65
)
which gives me:
It would be nicer to have a heading, that also spans the "line+point" sample region:
How can I realize this? (I tried for example to set n
or FALSE
in the lty-section, but that did not work,...).
I also failed with aligning the qc
and beta
-values, but thats a different story,...
回答1:
A similar approach, but using the legend
title, and creating two legends (without boxes) before adding the rectangle (box) afterwards
plot(1)
# legend 1
l1 <- legend(
"topleft"
, legend=c(expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)),
title = expression(bold("Long:" ~ (w==10^2 ~ ";" ~ h==10^5))),
, col=c( 1, 2, 3, 4, 5)
, lty=c(1, 1, 1, 1, 1)
, cex=.65,
bty='n')
# legend 2, placed directly below legend 1
l2 <- legend(x = l1$rect$left, y = with(l1$rect, top - h),
legend =c(expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)),
title = expression(bold("Wide:" ~ (w==10^3 ~ ";" ~ h==10^3))),
col=c( 1, 2, 3, 4, 5)
, lty=c( 2, 2, 2, 2, 2)
, cex=.65,
bty='n')
# add the rectangle around the legend
rect(xleft = l1$rect$left, ybottom = with(l2$rect, top - h),
xright = l1$rect$left + max(l1$rect$w, l1$rect$w), ytop = l1$rect$top)
回答2:
Using @DWin
's proposed solution method:
Set up an example plot:
plot(1:10,type="n")
Save the legend and phantom
hide the titles to be written manually
saveleg <- legend(
"bottomleft"
, legend=c(
expression(phantom(bold("Long:" ~ (w==10^2 ~ ";" ~ h==10^5))))
, expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)
, expression(phantom(bold("Wide:" ~ (w==10^3 ~ ";" ~ h==10^3))))
, expression(q[c] == 0.00 ~ ";" ~ beta == 0)
, expression(q[c] == 0.05 ~ ";" ~ beta == 2)
, expression(q[c] == 0.10 ~ ";" ~ beta == 10)
, expression(q[c] == 0.20 ~ ";" ~ beta == 10)
, expression(q[c] == 0.40 ~ ";" ~ beta == 10)
)
, col=c("n", 1, 2, 3, 4, 5, -1, 1, 2, 3, 4, 5)
, lty=c(F, 1, 1, 1, 1, 1, -1, 2, 2, 2, 2, 2)
, cex=.65
, trace=TRUE
)
Then grab the y-axis values of the two bits of text
to be replotted from the saved legend with newly specified x-axis values.
text(
c(0.6,0.6),
saveleg$text$y[c(1,7)],
c(
expression(bold("Long:" ~ (w==10^2 ~ ";" ~ h==10^5))),
expression(bold("Wide:" ~ (w==10^3 ~ ";" ~ h==10^3)))
),
cex=0.65,
pos=4
)
Result: