这是一个很大的痛苦,因为你必须调整很多属性......但它可以做到。问题是字体、点和线大小的默认设置与 1/72 英寸的比例相关,R/RStudio 图像的默认分辨率为 72ppi。当您使用更高的分辨率时,这些尺寸会按像素比例变大,因此您必须同时调整 RStudio 窗口的大小和分辨率。
我建议的简单解决方案是使您的绘图开始时远大于 1050x699px,然后在 Rstudio 之外调整其大小以进行发布。但是,如果您真的想完全在 R 中完成它,您可以。
需要注意的关键是:
对于放错位置的图例意味着,图例的坐标可能很好,因为它是一个相对位置,但需要重新计算图例的其他属性,例如边距或标题大小。对于未调整大小的字体,这意味着必须根据res ppi 和 Rstudio 窗口的大小重新计算大小。由于未在theme 中指定未指定大小的行,这意味着它们必须相对于theme_get() 中的默认值重新计算。我将分段分解每个组件的解决方案。
RStudio 窗口
我将首先在我的默认 Rstudio 窗口中发布绘图如何显示的屏幕截图(使用 MacBook 上的屏幕截图实用程序拍摄):
我可以使用dev.size("px") 获取我的 Rstudio 窗口的大小(以像素为单位)。我的恰好是:
> dev.size("px")
[1] 577 563
我的 RStudio 窗口比所需 TIFF 图的尺寸更方形。这意味着纵横比将不准确,更多取决于用户。就我而言,我将尝试纠正与窗口宽度相关的问题,577。
你目前可能拥有的
当您执行问题中的代码时,您最终可能会得到如下图像:
> test <- ggplot(dat, aes(x=xvar, y=yvar, color=cond)) +
geom_point(shape=1) +
scale_colour_hue(l=50) + # Use a slightly darker palette than normal
geom_smooth(method=lm, # Add linear regression lines
se=FALSE) +
theme(legend.position=c(.75,.38),
axis.title.y = element_text(colour="black", size = 18),
axis.title.x = element_text( colour="black", size = 18),
axis.text.x=element_text(colour="black", size= 16),
axis.text.y=element_text( colour="black", size = 16),
plot.title=element_text(size=14), # changing size of plot title)+
legend.text=element_text( size=16))
>
> tiff("test.tiff", width= 1050, height= 699, units="px", res=300)
>
> plot(test)
> dev.off()
很丑;一切都需要调整。
简单的解决方案
诚实地使 TIFF 文件更大,然后在预览中手动调整大小是最简单的方法。为了保持与 RStudio 窗口中的外观相同,您需要按 ppi 比率进行调整。因此,对于我们的绘图,我们将有 577px*300ppi/72ppi=2404px。等效高度将是 2404px*699px/1050px = 1600px。
tiff("test2.tiff", width= 2404, height= 1600, units="px", res=300)
plot(test)
dev.off()
结果(由于 TIFF 文件太大而截屏):
然后可以在预览中调整大小。
字体大小
由于pointsize 在res ppi 处为 1/72 英寸,因此在 Rstudio 图中,这意味着轴标题为 18 x 1/72 英寸 x 72ppi = 18 像素。所以 1 点 = 1 像素。在宽度 = 577 像素的绘图上,轴标题所占绘图的比例因此为 18/577=0.032。因此,在 72ppi 宽度 = 1050 像素的绘图上,我想要 18/577*1050=32.76 点字体。但是,我的情节实际上是在 300ppi 时 width=1050pixels。所以我还需要通过绘图之间的 ppi 之间的比率进行调整,72ppi/300ppi。这给了我 32.76point/300*72=7.86 点来获得与我的 Rstudio 窗口中相同的字体。因此,我的公式是 x/577*1050/300*72 从我的 Rstudio 窗口中的点大小转换为我的 TIFF 图像中的点大小。所以:
- 18pts/577*1050/300*72=7.86pts
- 16pts/577*1050/300*72=6.99pts
- 14pts/577*1050/300*72=6.11pts
这些是我应该在theme 参数中实际输入的点。
线条和点的大小
没有指定线和点的大小,所以我们必须从test$layers获取它:
#layers[[1]] is geom_point
> point_size<-test$layers[[1]]$geom$default_aes$size
> point_size
[1] 1.5
#layers[[2]] is geom_smooth
> line_size<-test$layers[[2]]$geom$default_aes$size
> line_size
[1] 1
使用与上面相同的逻辑,这意味着我们想要尺寸:
- 1.5/577*1050/300*72=0.66
- 1/577*1050/300*72=0.44
图例位置
在示例中,图例位置为c(.75,.38)。这很好,但由于 1)我的 Rstudio 窗口大部分是方形的,以及 2)图例的其他属性,例如边距大小和框大小,因此主观上可能看起来放错了位置。我可以通过theme_get() 获得这些其他属性:
> theme_get()$legend.margin
[1] 5.5pt 5.5pt 5.5pt 5.5pt
> theme_get()$legend.key.size
[1] 1.2lines
这给了我们:
把它们放在一起
将上面的代码sn-p放在一起,我们会输入:
test<- ggplot(dat, aes(x=xvar, y=yvar, color=cond)) +
geom_point(shape=1,size=0.66) +
scale_colour_hue(l=50) + # Use a slightly darker palette than normal
geom_smooth(method=lm, # Add linear regression lines
se=FALSE,size=0.44)+
theme(legend.position=c(.75,.38),
axis.title.y = element_text(colour="black", size = 7.62),
axis.title.x = element_text( colour="black", size = 7.62),
axis.text.x=element_text(colour="black", size= 6.99),
axis.text.y=element_text( colour="black", size = 6.99),
plot.title=element_text(size=6.11), # changing size of plot title)+
legend.text=element_text( size=6.11),
legend.title=element_text(size=6.11), # legend title size wasn't specified originally
legend.margin=margin(t=2.4,r=2.4,b=2.4,l=2.4),
legend.key.size = unit(0.52,"lines"))
tiff("test.tiff", width= 1050, height= 699, units="px", res=300)
plot(test)
dev.off()
这给了我们
这似乎足够接近。 (图例位置不太一样,但我们也从方形变成了矩形)
一些补充说明
一种大大简化计算并且能够更好地比较图例位置的方法是从 1050x699 像素的窗口大小开始,而不是我的方形窗口。然后您只需将线条和字体大小调整为 72/300,而不是额外的窗口大小调整。我做了一个随机的不同大小来显示窗口大小和分辨率的结合。
当然,除了精确计算之外,另一种方法是玩弄点、字体、线、边距等大小,直到得到你喜欢的东西。