我正在尝试用相当定制的外观来绘制一些东西,其中一个设计指南指出,绘图的上限应该有一条网格线,在某种程度上描绘了绘图。
现在,在 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
但是:
当我保存 a png 时:
ggsave("testplot.png", p)
我发现这种行为相当令人困惑,我无法弄清楚,当刻度线没有被切断时,是什么导致网格线被切断。 解决方法是稍微扩展 Y 轴
scale_y_continuous(limits = c(0, 50),
expand=expansion(mult=c(0,0.0015)))
这给了我这个png:
但我必须说我发现这个解决方案不太实用。 此外,在 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 轴线比网格线长。您可以通过两种方式处理这个问题:
- 您可以在轴刻度上设置此
lineend
,但随后它们可能会开始与文本重叠。因此,我建议您也调整文本边距。 - 您也可以在面板网格线上设置此
lineend
。
关于r - 使用 Expand=expansion() 时顶部主网格线的宽度发生变化 - 轴线被切断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71123565/