3

使用 创建非常高的水平条形图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()

reprex 包(v0.2.1)于 2018 年 9 月 19 日创建

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

ggsave("long_example.png",
       width = 4,
       height = 6,
       dpi=200)

阿比盖尔的栏现在显示

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

4

1 回答 1

4

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

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')

使用上述定义的图形选项,我的图形将有 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()

reprex 包(v0.2.1)于 2018 年 9 月 21 日创建

于 2018-09-21T15:43:17.790 回答