r - 使用 Expand=expansion() 时顶部主网格线的宽度发生变化 - 轴线被切断

标签 r ggplot2

我正在尝试用相当定制的外观来绘制一些东西,其中一个设计指南指出,绘图的上限应该有一条网格线,在某种程度上描绘了绘图。 现在,在 ggplot 中,这应该可以使用 scale_y_continuous() 内部的 limits()expand() 来实现。 示例:

library(ggplot)
p <- ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  scale_y_continuous(limits = c(0, 50),
                     expand=expansion()) +
  theme_light() +
  theme(axis.line = element_line(color = '#000000', size=0.265),
        #Ticks
        axis.ticks = element_line(color = '#000000', size=0.265),
        axis.ticks.length = unit(5, "pt"),
        panel.grid.major.y = element_line(color='#7f7f7f', size=0.265),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        panel.border = element_blank())
p

在 RStudio 的绘图 Pane 中,看起来不错: enter image description here

但是: 当我保存 a png 时:

ggsave("testplot.png", p)

输出的左上角如下所示: enter image description here

我发现这种行为相当令人困惑,我无法弄清楚,当刻度线没有被切断时,是什么导致网格线被切断。 解决方法是稍微扩展 Y 轴

scale_y_continuous(limits = c(0, 50),
                     expand=expansion(mult=c(0,0.0015)))

这给了我这个png:

enter image description here

但我必须说我发现这个解决方案不太实用。 此外,在 RStudio 的绘图 Pane 中,Y 轴现在稍微延伸到最顶部的网格线...

谁能解释一下,这里发生了什么,有没有办法不切割顶部网格线?

最佳答案

TL;DR:这是因为剪辑。让我们通过给它额外的粗线来夸大你的情节。

library(ggplot2)
p <- ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  scale_y_continuous(limits = c(0, 50),
                     expand=expansion()) +
  theme_light() +
  theme(axis.line = element_line(color = '#000000', size=5),
        axis.ticks = element_line(color = '#000000', size=5),
        axis.ticks.length = unit(10, "pt"),
        panel.grid.major.y = element_line(color='#7f7f7f', size=5),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        panel.border = element_blank())
p

在上图中,很明显顶部网格线看起来比其他网格线更细。这是由于面板剪切所致,它将面板上的任何内容(包括网格线)剪切到面板区域。您可以按如下方式将其打开:

p + coord_cartesian(clip = "off")

看起来已经好多了。作为我们注重细节的奖励,您可以看到轴顶部有一个奇怪的“咬合”。这是因为刻度线和轴线在 90 度角下相交,但不是同一条(多边形)线的一部分(因此未连接)。为了使这个角漂亮且齐平,您可以设置轴线或刻度的lineend

p + coord_cartesian(clip = "off") +
  theme(axis.line = element_line(colour = "#000000", size = 5,
                                  lineend = "square"))

reprex package 于 2022 年 2 月 15 日创建(v2.0.1)

请注意,这会产生明显的延伸,使 x 轴线比网格线长。您可以通过两种方式处理这个问题:

  1. 您可以在轴刻度上设置此 lineend,但随后它们可能会开始与文本重叠。因此,我建议您也调整文本边距。
  2. 您也可以在面板网格线上设置此lineend

关于r - 使用 Expand=expansion() 时顶部主网格线的宽度发生变化 - 轴线被切断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71123565/

相关文章:

r - rpart 的混淆矩阵

r - 需要在 ggplot2 中使用 viridis 进行特定着色

r - 如何在函数内使用 tabyl() 和两个变量?

读取以空格分隔的文本文件,其中第一列也有空格

r - 如何使用 xyz 不同数据在 R 中制作热图

python - 如何在 R chunk Quarto 中可视化 Pandas Dataframe?

r - 将原始数据叠加到 geom_bar 上

r - ggplot2 在 R 3.0.2 上安装失败

r - 将数据标准化为 100%,但总值小于 1.00

非时间数据的 R 运行平均值