为什么tiff输出看起来与R studio中的ggplot2输出不同?

Eli*_*eth 7 tiff r ggplot2

我正在最新版本的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保存.我究竟做错了什么?我有什么误会?

谢谢!

aug*_*ust 5

这是一个很大的痛苦,因为您必须调整许多属性...但是可以做到。问题是存在为字体,点和行大小设置的默认值,这些默认值与1/72英寸的比例相关,并且R / RStudio图像的默认分辨率为72ppi。当使用更高的分辨率时,这些尺寸会按像素比例成比例地变大,因此必须同时调整RStudio窗口的尺寸和分辨率。

我建议的简单解决方案是,首先使绘图大于1050x699px,然后在Rstudio外部调整其大小以进行发布。但是,如果您真的想在R中完全做到这一点,则可以。

需要注意的关键事项是:

  • R和RStudio图像的默认分辨率为72ppi
  • 当前RStudio图像窗口的大小可以通过以下方式确定 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窗口

首先,我将在默认的Rstudio窗口中发布该图的显示方式的屏幕截图(通过MacBook上的屏幕截图实用程序拍摄):

来自Rstudio的图片,尺寸为72ppi,尺寸为577x563px

我可以使用来获取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文件太大而捕获):

300ppi时2404x1600px TIFF的屏幕截图

然后可以在“预览”中调整大小。

字号

由于pointsizeresppi 处为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图像中的点大小。所以:

  • 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
Run Code Online (Sandbox Code Playgroud)

使用与上述相同的逻辑,这意味着我们需要大小:

  • 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
Run Code Online (Sandbox Code Playgroud)

这样就给我们:

放在一起

将所有内容与上述代码段放在一起,我们将输入:

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