Как сопоставить размер изображения PNG между ручным выполнением чанка и вязанием файла с помощью Knitr и ggsave

Я связал PDF-файл с помощью пакета «knitr». Он также сохраняет файл PNG в каталоге с помощью «ggsave».

  • Когда файл PNG генерируется вручную из фрагмента
    • Гистограмма: размер файла PNG составляет 13,3 КБ, а размеры — 1008 x 1008.
  • Когда файл PNG генерируется в процессе вязания, используйте "Ctrl + Shift + K"
    • Гистограмма: размер файла PNG составляет 11,4 КБ, а размеры — 936 x 647.

Что мне сделать, чтобы файлы PNG, созданные в обоих случаях, имели одинаковый размер и размеры? Если возможно, я бы предпочел, чтобы выходной файл был размером 13,3 КБ в обоих случаях.

Я добавил код для минимального воспроизводимого примера. Пожалуйста, сохраните его как файл ".Rmd" для создания PNG и PDF.

Благодарю вас

  • Заголовок YAML файла для создания PDF (окружите его тройными тире)
title: "Image Size Mismatch"
output: pdf_document
  • Код R для загрузки пакетов, создания гистограммы и сохранения ее в формате PNG.

Обновлено: Пример меньшего кода

# 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

Честно говоря, ваш «минимальный» пример требует 4 импорта и вызова для определения цвета фона? Кстати, вы можете контролировать размер png в вызове ggsave, и вы можете найти некоторую информацию о размере в вязаном документе здесь: bookdown.org/yihui/rmarkdown-cookbook/figure-size.html

Bernhard 05.05.2022 14:18

@Bernhard 'dplyr', вероятно, не требуется, и его можно исключить. Однако нужны еще 3. Мой вопрос о том, что «один и тот же код должен генерировать одинаковый результат в обоих случаях». Я просмотрел эту страницу, но она не прояснила мою проблему. Тем не менее, спасибо за ваше время.

Shivam7898 05.05.2022 14:25

@Bernhard Во-вторых, вы правы, я мог бы уменьшить требуемый код, когда меня интересует разница в размерах изображений. Извините, так и сделаю.

Shivam7898 05.05.2022 14:35

Вы можете указать размер PNG в вызове ggsave и размер изображения в вязаном документе с помощью опции fig.dim в RMarkdown. Если вы установите для обоих одинаковый размер и, возможно, отрегулируете dpi в вызове ggsave, чтобы он соответствовал dpi вашего документа, как это не поможет с вашей проблемой?

Bernhard 05.05.2022 15:48

@ Бернхард, спасибо. Понял наконец!! ggsave берет размер из окна, которое оказалось (6,3 дюйма) отличным от размера по умолчанию для трикотажа (7 дюймов). При выполнении чанка вручную используется настройка Knitr (7). Однако во время вязания ggsave предоставляет размер окна R (6.3), который переопределяет значение по умолчанию для вязания. Предоставление значения в вызове ggsave решило мою проблему, как вы предложили. Если вы напишете свой комментарий в качестве ответа, я приму его, иначе завтра исправлю сам. Спасибо еще раз за помощь.

Shivam7898 05.05.2022 16:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете контролировать, насколько большим и с каким соотношением сторон будет отображаться график как в RMarkdown, так и с помощью ggsave. Для вашей цели вы захотите установить для обоих одинаковые значения.

Регулировка размера графика и, следовательно, соотношения сторон описаны в https://bookdown.org/yihui/rmarkdown-cookbook/figure-size.html, правильное использование ggsave в help("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. Будьте зовом ggsave в Rmd или за его пределами.

Другие вопросы по теме