如何在手动执行块和使用 knitr 和 ggsave 编织文件之间匹配 PNG 图像大小

How to match the PNG image size between manually executing a chunk and knitting a file using knitr and ggsave

我使用 'knitr' 包编写了一个 PDF。它还使用 'ggsave'.

在目录中保存一个 PNG 文件

我应该怎么做才能使两种情况下生成的 PNG 文件具有相同的大小和尺寸?如果可能的话,我希望两种情况下的输出均为 13.3 kb .

我添加了最小可重现示例的代码。请将其保存为“.Rmd”文件以生成 PNG 和 PDF。

谢谢

title: "Image Size Mismatch"
output: pdf_document

编辑:更小的代码示例

# Packages
library("knitr")
library("ggplot2")

# Data
hh <- data.frame(groups = factor(c("No", "Yes", NA)), n = c(3843, 856, 19))

# Create Chart
pp <- ggplot(data = hh, aes(x = groups, y = n)) + geom_bar(stat = 'identity')

# Save Image
ggsave("Bar.png", plot = pp, device = "png", dpi = 144)

较早的示例:它有一些不必要的代码。

# Packages
library("knitr")
library("dplyr")
library("tibble")
library("ggplot2")

# Data
hh <- tibble(groups = factor(c("No", "Yes", NA)), n = c(3843, 856, 19))
loc_png <- "Pie.png"

# Create Pie Chart
pp <- ggplot(data = hh, aes(x = '', y = n, fill = groups)) +
    geom_bar(stat = 'identity', width = 1, color = "white") +
    coord_polar(theta = "y", start = 0) +
    # Add Text Labels
    geom_text(aes(label = paste0(groups, "\n", n)),
              position = position_stack(vjust = 0.5)) +
    # Theme and Labs
    theme(panel.background = element_rect(fill = "white", colour = "white"),
          legend.position = 'none', axis.text = element_blank(), 
          axis.ticks = element_blank(), axis.title = element_blank(), 
          panel.grid = element_blank()) + 
    labs(title = "Pie")

# Save Image
ggsave(loc_png, plot = pp, device = "png", dpi = 144)
# Problem: 
# Manual Chunk Execution: Output File: Size 32.5 kb, Dimension 1008 x 1008
# Knit "Ctrl +Shift +K" : Output File: Size 22.4 kb, Dimension 936 x 647

您可以控制在 RMarkdown 和 ggsave 中绘制的图的大小和纵横比。为了您的目的,您需要将两者设置为相同的值。

https://bookdown.org/yihui/rmarkdown-cookbook/figure-size.html 中描述了调整绘图大小和宽高比,help("ggsave").

中描述了 ggsave 的正确使用

以下最小示例是有效的 Rmd,并使用同一文件中的两个选项:

---
title: "Untitled"
output: pdf_document
---

```{r, fig.dim = c(5, 3)}
library(ggplot2)

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width))

ggsave("test.png", width = 5, height = 3, units = "in")
```

老实说,我不知道针织文档中使用了多少每英寸点数 (dpi),我的示例似乎是作为矢量文件编写的,但如果需要,也可以很容易地在ggsave 的调用。在 Rmd 之内或之外调用 ggsave