【问题标题】:Get size of plot in pixels in R获取 R 中的绘图大小(以像素为单位)
【发布时间】:2020-05-18 16:55:49
【问题描述】:

我正在 R 中生成一个包含很多行的热图。
TL;DR 我如何获得 R 中绘图的实际大小?

df=data.frame(one=1:100,two=101:200,three=201:300)
names=1:100
names=paste0("Cell",names)
rownames(df)=(names)
pheatmap(df,scale="row")

默认图片适合窗口,但我们无法读取行名。

pheatmap(df,scale="row",cellheight = 10) 更改单元格高度可以让我们读取行名,但现在图像不适合窗口!

在这个例子中,我使用的是pheatmap,但也遇到了其他绘图生成包的问题。

虽然我已经开始期望 R 会出现这种令人沮丧的行为,并且通过反复试验可以为情节制作适当大小的图像,但这似乎是我应该能够从程序中获得的东西?

有没有办法自动获取绘图的尺寸,以便我可以为其创建正确大小的 PDF 或 PNG?

【问题讨论】:

  • 由你来告诉 R 你想要多大的绘图设备。您可以将绘图窗口的大小指定为与您的 pdf 或 png 相同的大小。
  • 但你的问题的简短答案是dev.size(units = "px")
  • @AllanCameron 当我制作像png("myplot.png") 这样的图像设备时,dev.size 就是绘图设备的大小,与我要放置的绘图的实际大小无关在里面。即我的情节在 72dpi 时高约 1200 像素,但我通过反复试验发现了这一点。
  • 我明白了。 R 中的大多数绘图都是以相对比例绘制的,因此它们会根据窗口大小调整大小。 pheatmap 必须以绝对值指定绘图。我去看看。

标签: r plot pheatmap


【解决方案1】:

函数pheatmap 使用网格图形来绘制它的图,并在“bigpts”中指定其元素的大小,其中 72“bigpts”== 1 英寸。如果您有很多行并指定合理的行高,这将超出绘图窗口。

因为它被指定为gtree,所以我们实际上可以访问组件的高度和宽度,并使用它们来设置我们的png或pdf的尺寸。

此函数将获取绘图的总高度和宽度(以英寸为单位),并将它们返回到命名列表中:

get_plot_dims <- function(heat_map)
{
  plot_height <- sum(sapply(heat_map$gtable$heights, grid::convertHeight, "in"))
  plot_width  <- sum(sapply(heat_map$gtable$widths, grid::convertWidth, "in"))
  return(list(height = plot_height, width = plot_width))
}

我们可以使用它来指定绘图设备的尺寸:

my_plot <- pheatmap(df,scale="row", cellheight = 10)
plot_dims <- get_plot_dims(my_plot)

png("plot.png", height = plot_dims$height, width = plot_dims$width, units = "in", res = 72)
my_plot
dev.off()

这给出了所需的情节

请注意,这不是 R 图的通用解决方案,而是特定于 pheatmap 对象的解决方案。

【讨论】:

  • 感谢您所做的工作。我现在看到问题是这些对象中的大多数只是调整大小以适合它们的容器,而我刚刚找到了一种奇怪的方法来使情节具有设定的大小.所以我试图使图像设备与绘图的大小相匹配,而 R 试图使绘图与图像设备的大小相匹配......等等。
  • 正是@jeffpkamp。我花了好几年的时间才明白这一点——你的洞察力给我留下了深刻的印象!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多