这是一个社区 wiki,本质上是复制用户 teunbrand 对该主题的规范答案- 以便为这个更大的线程添加更多可见性。
考虑下图(geom_col()
等价于geom_bar(stat = "identity")
):
df <- data.frame(x = letters[1:7],
y = 1:7)
g <- ggplot(df, aes(x, y)) +
geom_col()
g
您可以清楚地看到条形图看起来像矩形。检查基础绘图数据,确认条形图已参数化为具有 xmin/xmax/ymin/ymax 参数化的矩形:
> layer_data(g)
x y PANEL group ymin ymax xmin xmax colour fill size linetype alpha
1 1 1 1 1 0 1 0.55 1.45 NA grey35 0.5 1 NA
2 2 2 1 2 0 2 1.55 2.45 NA grey35 0.5 1 NA
3 3 3 1 3 0 3 2.55 3.45 NA grey35 0.5 1 NA
4 4 4 1 4 0 4 3.55 4.45 NA grey35 0.5 1 NA
5 5 5 1 5 0 5 4.55 5.45 NA grey35 0.5 1 NA
6 6 6 1 6 0 6 5.55 6.45 NA grey35 0.5 1 NA
7 7 7 1 7 0 7 6.55 7.45 NA grey35 0.5 1 NA
现在考虑以下情节:
g2 <- ggplot(df, aes(x, y)) +
geom_col() +
scale_y_continuous(limits = c(1, 7))
这个是空的,反映了你发布的案例。检查基础数据会产生以下结果:
> layer_data(g2)
y x PANEL group ymin ymax xmin xmax colour fill size linetype alpha
1 1 1 1 1 NA 1 0.55 1.45 NA grey35 0.5 1 NA
2 2 2 1 2 NA 2 1.55 2.45 NA grey35 0.5 1 NA
3 3 3 1 3 NA 3 2.55 3.45 NA grey35 0.5 1 NA
4 4 4 1 4 NA 4 3.55 4.45 NA grey35 0.5 1 NA
5 5 5 1 5 NA 5 4.55 5.45 NA grey35 0.5 1 NA
6 6 6 1 6 NA 6 5.55 6.45 NA grey35 0.5 1 NA
7 7 7 1 7 NA 7 6.55 7.45 NA grey35 0.5 1 NA
可以看到该ymin
列被替换为NA
s。此行为取决于 的oob
(越界)参数scale_y_continuous()
,该参数默认为scales::censor()
函数。这会检查(替换为NA
)超出轴限制的任何值,其中包括应该是ymin
列的 0。因此,无法绘制矩形。
有两种方法可以解决这个问题。正如 Magnus 建议的那样,一位候选人确实ylim
在函数中使用了参数coord_cartesian()
:
ggplot(df, aes(x, y)) +
geom_col() +
coord_cartesian(ylim = c(1, 7))
在函数内指定限制coord_*
会导致图形对象被剪裁。当您关闭剪辑时,您可以看到这一点:
ggplot(df, aes(x, y)) +
geom_col() +
coord_cartesian(ylim = c(1, 7), clip = "off")
另一种选择是在 中使用替代oob
参数scale_y_continuous
,例如scales::squish
:
g3 <- ggplot(df, aes(x, y)) +
geom_col() +
scale_y_continuous(limits = c(1, 7),
oob = scales::squish)
g3
它的作用是用最近的限制替换限制之外的任何值,例如ymin
0 变为 1:
> layer_data(g3)
y x PANEL group ymin ymax xmin xmax colour fill size linetype alpha
1 1 1 1 1 1 1 0.55 1.45 NA grey35 0.5 1 NA
2 2 2 1 2 1 2 1.55 2.45 NA grey35 0.5 1 NA
3 3 3 1 3 1 3 2.55 3.45 NA grey35 0.5 1 NA
4 4 4 1 4 1 4 3.55 4.45 NA grey35 0.5 1 NA
5 5 5 1 5 1 5 4.55 5.45 NA grey35 0.5 1 NA
6 6 6 1 6 1 6 5.55 6.45 NA grey35 0.5 1 NA
7 7 7 1 7 1 7 6.55 7.45 NA grey35 0.5 1 NA
你可以做的另一件事是为参数提供一个自定义函数oob
,它只是返回它的输入。由于默认情况下,裁剪是打开的,这反映了这种coord_cartesian(ylim = c(1,7))
情况:
ggplot(df, aes(x, y)) +
geom_col() +
scale_y_continuous(limits = c(1, 7),
oob = function(x, ...){x})