我正在最新版本的R studio中使用ggplot2制作出版品质图.
它们需要以300 dpi保存为TIFF.
当我运行代码并在命令控制台中调用绘图时,它在绘图窗口中完美显示.但是,当我将它保存为带有宽度,高度和分辨率命令的tiff时,当我在图像查看器中打开tiff时,它看起来完全搞砸了.字体很大,传说很大,错位等.
我试图从R studio绘图窗口导出图像,但我只有高度和宽度选项.因为我想要300 dpi的数字是3.5 x 2.33我理解宽度:高度将是1050:699(像素).但是,也许我误解了这个条目.
也许,我应该以英寸为单位输入高度和宽度.如果我这样做,那我怎么指定dpi?
我使用tiff命令保存了我的情节.这是从Cookbook forR借来的可重复的例子
set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each=10),
xvar = 1:20 + rnorm(20,sd=3),
yvar = 1:20 + rnorm(20,sd=3))
library(ggplot2)
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()
Run Code Online (Sandbox Code Playgroud)
当我使用预览打开它时看起来完全搞砸了.我希望它看起来与在绘图窗口中完全一样,但是以某个dpi保存.我究竟做错了什么?我有什么误会?
谢谢!
这是一个很大的痛苦,因为您必须调整许多属性...但是可以做到。问题是存在为字体,点和行大小设置的默认值,这些默认值与1/72英寸的比例相关,并且R / RStudio图像的默认分辨率为72ppi。当使用更高的分辨率时,这些尺寸会按像素比例成比例地变大,因此必须同时调整RStudio窗口的尺寸和分辨率。
我建议的简单解决方案是,首先使绘图大于1050x699px,然后在Rstudio外部调整其大小以进行发布。但是,如果您真的想在R中完全做到这一点,则可以。
需要注意的关键事项是:
dev.size()pointsizeaka bigpts相对于英寸,并解释为1/72英寸。因此,它以像素数形式显示为pointsize/ 72inches * resppi(请参阅单位)ggplot2图层具有点,线等属性的默认设置str(test)。ggplot2例如图例字体大小,图例标题大小,图例框间距theme_get()legend.position是由值来确定从0到1,其中左下是0,0和右上是1,1-这对于错位的图例意味着什么,因为它是相对位置,所以图例的坐标可能很好,但是需要重新计算图例的其他属性,例如页边距或标题大小。对于字体丢失而言,意味着必须相对于resppi和Rstudio窗口的大小重新计算大小。由于未在中指定行,因此对于遗漏行而言,意味着theme必须相对于中的默认值重新计算它们theme_get()。我将按部分细分每个组件的解决方案。
首先,我将在默认的Rstudio窗口中发布该图的显示方式的屏幕截图(通过MacBook上的屏幕截图实用程序拍摄):
我可以使用来获取Rstudio窗口的大小(以像素为单位)dev.size("px")。我的碰巧是:
> dev.size("px")
[1] 577 563
Run Code Online (Sandbox Code Playgroud)
我的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()
Run Code Online (Sandbox Code Playgroud)
真是丑; 一切都需要调整。
老实说,将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()
Run Code Online (Sandbox Code Playgroud)
结果(由于TIFF文件太大而捕获):
然后可以在“预览”中调整大小。
由于pointsize在resppi 处为1/72 英寸,因此在Rstudio图中,这意味着轴标题为18 x 1 / 72inch x 72ppi = 18pixels。所以1点= 1像素 因此,在宽度= 577像素的图上,轴标题占据的图比例为18/577 = 0.032。因此,在宽度为1050像素(72ppi)的绘图中,我想要18/577 * 1050 = 32.76点字体。但是,我的图实际上是300ppi的width = 1050pixels。因此,我还需要根据曲线图之间的ppis比率进行调整,即72ppi / 300ppi。这给了我32.76点/300*72=7.86点,以获得与我的Rstudio窗口相同的字体。因此,我的公式是x / 577 * 1050/300 * 72,以从Rstudio窗口中的点大小转换为TIFF图像中的点大小。所以:
这些是我实际上应该进入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
Run Code Online (Sandbox Code Playgroud)
使用与上述相同的逻辑,这意味着我们需要大小:
在示例中,图例位置在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
Run Code Online (Sandbox Code Playgroud)
这样就给我们:
lines是一个单位,其中“ 位置和尺寸是视口默认文本大小的倍数(由视口的fontsize和lineheight指定)。 ”由于仍由fontsize和lineheight指定,因此我们可以执行相同的计算:1.2 /577*1050/300*72=0.52。将所有内容与上述代码段放在一起,我们将输入:
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()
Run Code Online (Sandbox Code Playgroud)
这给了我们
似乎足够接近。(图例的位置并不完全相同,但我们也从正方形图形变成了矩形图形)
一种大大简化计算并能够更好地比较图例位置的方法是从1050x699像素的窗口大小开始,而不是我拥有的正方形窗口。然后,您只需要按72/300调整行和字体大小,而不需要进行其他窗口大小调整。我做了一个随机的不同大小,以显示结合了分辨率的窗口大小。
当然,除了精确计算之外,还有一种替代方法是处理点,字体,线,边距等大小,直到获得所需的内容。
小智 4
乔兰的上述评论似乎是正确的答案。从上面的例子来看,尝试...
ggsave(filename = "test2.tiff", plot = test)
Run Code Online (Sandbox Code Playgroud)
默认情况下,ggsave()输出为 300 dpi,并将通过您的扩展猜测输出类型。它将使您的绘图看起来就像在绘图窗口中一样,因为它使用 获取绘图窗口大小grDevices::dev.size()。我猜测tiff()示例中传递的像素尺寸与绘图窗口的尺寸不同。这就是为什么保存的情节看起来不同。
如果您用来dev.size()获取当前绘图设备的尺寸,则应该能够使用 保存绘图,但在处理 类对象时tiff()使用包装器通常更容易。ggsave()ggplot