R reprex 没有为非常高的图渲染正确的 ggplot 输出

Dan*_*Tan 3 r ggplot2 reprex

当使用 创建非常高的水平条形图时ggplot2,使用该包呈现的图reprex会截断一些数据,而轴标签仍保留在正确的位置。这与相同代码的 ggplot 输出不同。

reprex输出:

library(babynames)
library(dplyr)
library(ggplot2)
data("babynames")

bn <- babynames %>% 
  filter(year == 2015) %>% 
  arrange(-n) %>% 
  head(400) %>% 
  mutate(highlight = ifelse(n>12000, TRUE, FALSE)) %>% 
  arrange(name)

breaks <- bn %>% filter(highlight == TRUE) %>% pull(name)

ggplot(bn, aes(x=name, y=n, fill=highlight)) +
  geom_col() +
  scale_x_discrete(breaks = breaks)+
  coord_flip() +
  theme_classic()
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.2.1)于 2018-09-19 创建

用于ggsave()保存 png 并将其上传到 stackoverflow:

ggsave("long_example.png",
       width = 4,
       height = 6,
       dpi=200)
Run Code Online (Sandbox Code Playgroud)

阿比盖尔的栏现已显示

在该ggsave()版本中,阿比盖尔的突出显示栏正确显示,而底部的几个栏(包括阿比盖尔的栏)在 reprex 版本中消失了。这里发生了什么?

Dan*_*Tan 5

正如尼克·拉森(Nick Larsen)指出的那样,问题不在于图中的底部栏被删除了;而在于底部栏被从图中删除了。当图像尺寸和分辨率设置为默认值时,图表中的一些条形图不会被渲染。这种行为的必要性是鸽巢原理的一个明显例子(如果我的条形图是鸽子,像素是洞)。在底层reprex使用来创建 markdown 输出,并提供一种语法来通过 markdown块选项修改这些限制性默认值(请参阅此处的更多 reprex 示例):knitr

reprex({

  #+ setup, include = FALSE
  knitr::opts_chunk$set(fig.width = 4, fig.height = 6, dpi = 200, warning = FALSE)

  #+ actual-reprex-code
  #{INSERT CODE HERE}

}, venue = 'so')
Run Code Online (Sandbox Code Playgroud)

使用上面定义的图形选项,我的图形将有 1200 像素的垂直空间,足以轻松容纳 400 个条形图和周围的图表区域。将问题中的示例代码替换为{INSERT CODE HERE},我们得到应用了代码块选项的所需reprex输出:knitr

library(babynames)
library(dplyr)
library(ggplot2)
data("babynames")

bn <- babynames %>% 
  filter(year == 2015) %>% 
  arrange(-n) %>% 
  head(400) %>% 
  mutate(highlight = ifelse(n > 12000, TRUE, FALSE)) %>% 
  arrange(name)

breaks <- bn %>% filter(highlight == TRUE) %>% pull(name)

ggplot(bn, aes(x = name, y = n, fill = highlight)) +
  geom_col() +
  scale_x_discrete(breaks = breaks)+
  coord_flip() +
  theme_classic()
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.2.1)于 2018-09-21 创建