使用 mfrow 时调整条形图的 size/width
Adjust size/width of barplot plots when using mfrow
我想使用 base R 生成两个图形,都显示条形图。第一个图应包含两个条形图,第二个图应包含四个条形图。
我使用 par(mfrow = c(...)) 在一个图中排列多个条形图。
我自己生成图形没有问题,但是当我保存图形时,条形宽度和刻度标签的大小不同。
据我了解,当我生成带有四个条形图的第二个图形并在导出时选择了第一个图形宽度的两倍时,条形图和标签在文件中应以相同的大小显示。但是,标签要小得多,并且第二个图中的条形宽度不同。谁能告诉我为什么?
这里有一个简单的例子:
png(filename="plot1.png", width=200, height=300, bg="white")
par(mfrow = c(1, 2), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow = c(1, 4), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()
地块 1:
情节 2:
可能 par
和 pdf(width, height)
应该相等。
png(filename="plot1.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()
另一个解决方案是使用 layout
.
def.par <- par(no.readonly=TRUE) # save par default, for resetting...
# 1 x 2 plot
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=2) # to inspect layout # MARK
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
# 1 x 4 plot
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=4) # to inspect layout
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
# 2 x 4 plot
layout(matrix(c(1:2, 0, 0, 3:6), nrow=2, ncol=4, byrow=TRUE))
layout.show(n=6) # to inspect layout
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
par(def.par) # reset to default
然而,这两种解决方案都带来了半空图 1,原因可以在上面的代码中看到 # MARK
。
我们可以使用 magick
包将第一个情节“砍”成所需的内容。首先,我们使用第二种方法创建 *.png
s。
clr <- "#ED7C22" # color
png(filename="plot1.png", width=400, height=300, bg="white")
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()
现在,使用 image_chop
我们 trim plot1.png
到它的左半部分。
library(magick)
(i <- image_read("plot1.png"))
i.chopped <- image_chop(i, "200x+200") # says: trim by 200px at pos. 200
最后,我们导出切好的图片。
image_write(i.chopped, path="plot1.ch.png", format="png")
情节 1(“切碎”)
情节 2
我想使用 base R 生成两个图形,都显示条形图。第一个图应包含两个条形图,第二个图应包含四个条形图。
我使用 par(mfrow = c(...)) 在一个图中排列多个条形图。 我自己生成图形没有问题,但是当我保存图形时,条形宽度和刻度标签的大小不同。
据我了解,当我生成带有四个条形图的第二个图形并在导出时选择了第一个图形宽度的两倍时,条形图和标签在文件中应以相同的大小显示。但是,标签要小得多,并且第二个图中的条形宽度不同。谁能告诉我为什么?
这里有一个简单的例子:
png(filename="plot1.png", width=200, height=300, bg="white")
par(mfrow = c(1, 2), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow = c(1, 4), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()
地块 1:
情节 2:
可能 par
和 pdf(width, height)
应该相等。
png(filename="plot1.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()
另一个解决方案是使用 layout
.
def.par <- par(no.readonly=TRUE) # save par default, for resetting...
# 1 x 2 plot
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=2) # to inspect layout # MARK
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
# 1 x 4 plot
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=4) # to inspect layout
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
# 2 x 4 plot
layout(matrix(c(1:2, 0, 0, 3:6), nrow=2, ncol=4, byrow=TRUE))
layout.show(n=6) # to inspect layout
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
par(def.par) # reset to default
然而,这两种解决方案都带来了半空图 1,原因可以在上面的代码中看到 # MARK
。
我们可以使用 magick
包将第一个情节“砍”成所需的内容。首先,我们使用第二种方法创建 *.png
s。
clr <- "#ED7C22" # color
png(filename="plot1.png", width=400, height=300, bg="white")
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()
png(filename="plot2.png", width=400, height=300, bg="white")
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()
现在,使用 image_chop
我们 trim plot1.png
到它的左半部分。
library(magick)
(i <- image_read("plot1.png"))
i.chopped <- image_chop(i, "200x+200") # says: trim by 200px at pos. 200
最后,我们导出切好的图片。
image_write(i.chopped, path="plot1.ch.png", format="png")