虽然 Magnus Nordmo 的答案很有帮助,但我想补充一下 ggplot2 如此行为的原因。
考虑下面的情节(友情提醒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
是。此行为取决于oob
(越界)参数scale_y_continuous()
,默认为scales::censor()
功能。该审查器(替换为NA
) 超出轴限制的任何值,其中包括应为的 0ymin
柱子。结果,无法绘制矩形。
有两种方法可以解决这个问题。一位候选人确实像马格努斯建议的那样使用ylim
论据中的coord_cartesian()
功能:
ggplot(df, aes(x, y)) +
geom_col() +
coord_cartesian(ylim = c(1, 7))
指定a内的限制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))
case:
ggplot(df, aes(x, y)) +
geom_col() +
scale_y_continuous(limits = c(1, 7),
oob = function(x, ...){x})
我希望这能澄清这里发生的事情。