R底图,结合镜像直角三角形
R base plot, combine mirrored right triangles
我正在尝试构建一些由 2 个直角三角形组成的图形,它们以彼此的镜像排列。最终的地块将有独特的数据集,但现在我正在绘制相同的数据。我更熟悉(可能被 ggplot 宠坏了),但我发现在基数 R 中移动轴位置要容易得多。如果有人知道如何在 ggplot 中复制这些直角三角形图,我会接受这个答案!
我在调整间距和布局时遇到问题。我不太熟悉 base R 绘图,抱歉,如果这些有点基础。
我特别想:
将三角形靠得更近
使标签可见(并使用不是 **main**
的顶部标签)
使对角线与坐标轴齐平
制作等长三角形的'legs'
library(cowplot)
my.data <- data.frame( my.x = c(.2,.4,.6, .1), my.y = c(.3, .5, .7, .9) )
top.triangle <- function(){
plot( my.y ~ my.x, data = my.data,
axes = FALSE, ylab = 'Position.2', xlab = NA, main='Position.1',
xlim=c(0,1), ylim=c(0,1), xaxt="n", yaxt="n" )
axis(side = 2, las = 1, pos=0)
axis(side = 3, las = 1, pos=1)
abline(coef = c(0,1))
}
bottom.triangle <- function() {
plot( my.x ~ my.y, data = my.data ,
axes = FALSE, xlab = 'Position.2', ylab = 'Position.1', xlim=c(0,1), ylim=c(0,1), xaxt="n", yaxt="n" )
axis(side = 1, las = 1, pos=0)
axis(4, las = 1, pos=1) #flip label to right side
abline(coef = c(0,1))}
plot_grid(top.triangle, bottom.triangle, rel_widths = c(.5,.5))
谢谢!
正如 @GregorThomas 所建议的那样,绘制单个图可能更好。为此,需要一个 transform
ed 附加数据框,将值移动 x.dist
.
的距离
my.data <- data.frame(my.x=c(.2, .4, .6, .1), my.y=c(.3, .5, .7, .9))
x.dist <- .5
my.data.2 <- transform(my.data, my.y=my.y + x.dist)
现在我已经对你的函数进行了大量修改,我建议逐行弄清楚我使用了哪些参数。重要的是,我使用 xpd=TRUE
能够绘制超出绘图区域的绘图。使用 par
我稍微扩展了 mar
gins。我使用 mtext
和 axis
来获取刻度线和标签。为了使对角线与轴齐平,我使用 lines
而不是 abline
。 bottom.triangle2 现在使用 points
而不是 plot
,因为 plot
没有 add=TRUE
参数。而我在top.triangle2
中使用asp=1
来制作等边三角形。
top.triangle2 <- function() {
plot(my.y ~ my.x, data= my.data, axes=FALSE, ylab='', xlab="",
main='', xlim=c(0, 1), ylim=c(0, 1), xaxt="n", yaxt="n", asp=1)
mtext("Here could be your title", 3, 5, font=2, cex=1.3, adj=.95)
mtext("Position.2", 2, .75)
mtext("Position.1", 3, 2)
axis(side=2, las=1, pos=0)
axis(side=3, las=1, pos=1)
lines(0:1, 0:1)
}
bottom.triangle2 <- function() {
points(my.x ~ my.y, data=my.data.2, xpd=TRUE)
mtext("Position.2", 1, 1.5, at=mean(par()$usr[1:2]) + x.dist)
mtext("Position.1", 4, 3, padj=par()$usr[1] + 10)
x.at <- axisTicks(par()$usr[1:2], 0) + x.dist
axis(side=1, las=1, pos=0, at=x.at,
labels=F, xpd=TRUE)
mtext(seq(0, 1, .2), 1, 0, at=x.at)
axis(4, las=1, pos=1 + x.dist)
lines(0:1 + x.dist, 0:1, xpd=TRUE)
}
我使用 png
来获得可重现的输出。
png("myplot.png", width=650, height=500)
op <- par(mar=c(3, 4, 8, 12) + 0.1, oma=c(2, 0, 0, 2))
top.triangle2()
bottom.triangle2()
par(op)
dev.off()
结果
也许您自己想出如何避免那么多硬编码。
我正在尝试构建一些由 2 个直角三角形组成的图形,它们以彼此的镜像排列。最终的地块将有独特的数据集,但现在我正在绘制相同的数据。我更熟悉(可能被 ggplot 宠坏了),但我发现在基数 R 中移动轴位置要容易得多。如果有人知道如何在 ggplot 中复制这些直角三角形图,我会接受这个答案!
我在调整间距和布局时遇到问题。我不太熟悉 base R 绘图,抱歉,如果这些有点基础。
我特别想:
将三角形靠得更近
使标签可见(并使用不是
**main**
的顶部标签)使对角线与坐标轴齐平
制作等长三角形的'legs'
library(cowplot) my.data <- data.frame( my.x = c(.2,.4,.6, .1), my.y = c(.3, .5, .7, .9) ) top.triangle <- function(){ plot( my.y ~ my.x, data = my.data, axes = FALSE, ylab = 'Position.2', xlab = NA, main='Position.1', xlim=c(0,1), ylim=c(0,1), xaxt="n", yaxt="n" ) axis(side = 2, las = 1, pos=0) axis(side = 3, las = 1, pos=1) abline(coef = c(0,1)) } bottom.triangle <- function() { plot( my.x ~ my.y, data = my.data , axes = FALSE, xlab = 'Position.2', ylab = 'Position.1', xlim=c(0,1), ylim=c(0,1), xaxt="n", yaxt="n" ) axis(side = 1, las = 1, pos=0) axis(4, las = 1, pos=1) #flip label to right side abline(coef = c(0,1))} plot_grid(top.triangle, bottom.triangle, rel_widths = c(.5,.5))
谢谢!
正如 @GregorThomas 所建议的那样,绘制单个图可能更好。为此,需要一个 transform
ed 附加数据框,将值移动 x.dist
.
my.data <- data.frame(my.x=c(.2, .4, .6, .1), my.y=c(.3, .5, .7, .9))
x.dist <- .5
my.data.2 <- transform(my.data, my.y=my.y + x.dist)
现在我已经对你的函数进行了大量修改,我建议逐行弄清楚我使用了哪些参数。重要的是,我使用 xpd=TRUE
能够绘制超出绘图区域的绘图。使用 par
我稍微扩展了 mar
gins。我使用 mtext
和 axis
来获取刻度线和标签。为了使对角线与轴齐平,我使用 lines
而不是 abline
。 bottom.triangle2 现在使用 points
而不是 plot
,因为 plot
没有 add=TRUE
参数。而我在top.triangle2
中使用asp=1
来制作等边三角形。
top.triangle2 <- function() {
plot(my.y ~ my.x, data= my.data, axes=FALSE, ylab='', xlab="",
main='', xlim=c(0, 1), ylim=c(0, 1), xaxt="n", yaxt="n", asp=1)
mtext("Here could be your title", 3, 5, font=2, cex=1.3, adj=.95)
mtext("Position.2", 2, .75)
mtext("Position.1", 3, 2)
axis(side=2, las=1, pos=0)
axis(side=3, las=1, pos=1)
lines(0:1, 0:1)
}
bottom.triangle2 <- function() {
points(my.x ~ my.y, data=my.data.2, xpd=TRUE)
mtext("Position.2", 1, 1.5, at=mean(par()$usr[1:2]) + x.dist)
mtext("Position.1", 4, 3, padj=par()$usr[1] + 10)
x.at <- axisTicks(par()$usr[1:2], 0) + x.dist
axis(side=1, las=1, pos=0, at=x.at,
labels=F, xpd=TRUE)
mtext(seq(0, 1, .2), 1, 0, at=x.at)
axis(4, las=1, pos=1 + x.dist)
lines(0:1 + x.dist, 0:1, xpd=TRUE)
}
我使用 png
来获得可重现的输出。
png("myplot.png", width=650, height=500)
op <- par(mar=c(3, 4, 8, 12) + 0.1, oma=c(2, 0, 0, 2))
top.triangle2()
bottom.triangle2()
par(op)
dev.off()
结果
也许您自己想出如何避免那么多硬编码。