36

我遇到了 geom_bars 的问题,其中当我在 y 轴上指定限制时,没有呈现条形。我相信以下应该重现该问题:

data <- structure(list(RoleCond = structure(c(1L, 1L, 2L, 2L), .Label = c("Buyer", "Seller"), class = "factor"), 
                   ArgCond = structure(c(1L, 2L, 1L, 2L), .Label = c("No Argument", "Argument"), class = "factor"), 
                   mean = c(2210.71428571429, 2142.70833333333, 2282.40740740741, 2346.2962962963), 
                   se = c(20.1231042081511, 16.7408757749718, 20.1471554637891, 15.708092540868)), 
                   .Names = c("RoleCond", "ArgCond", "mean", "se"), row.names = c(NA, -4L), class = "data.frame")

library(ggplot2)    
ggplot(data=data, aes(fill=RoleCond, y=mean, x=ArgCond)) + 
      geom_bar(position="dodge", stat="identity") + 
      geom_errorbar(limits, position=dodge, width=0.1, size=.75) + 
      scale_y_continuous(limits=c(2000,2500))

这给了我这个

没有酒吧

没有指定限制的相同代码可以正常工作。geom_errorbar() 似乎与问题无关,但它确实说明了应该在哪里显示条。

我试过使用coord_cartesian(ylim=c(2000,2500))which 来限制 yaxis 并让条形图显示,但是轴标签搞砸了,我不明白我在用它做什么。

感谢您的任何建议!(我正在使用 R 2.15.0 和 ggplot2 0.9.0)

4

4 回答 4

55

您可以尝试使用library(scales)

+ scale_y_continuous(limits=c(2000,2500),oob = rescale_none)

相反,如此所述。

于 2012-04-28T16:03:43.213 回答
12

为我的案例添加一个稍微不同的答案,以防有人遇到这个问题:

使用position="dodge"时,条形会自动水平调整大小以填充通常远远超出数据本身限制的空间。因此,即使 yourx-axisy-axislimits 都是limits=c(min-1, max+1,对于某些数据集,position="dodge"可能会将其大小调整到超出该限制范围,从而导致条形不出现。与上述情况不同,如果您的限制下限为 0,甚至可能发生这种情况。

oob=rescale_none在两者中使用scale_y_continous()ANDscale_x_continuous()通过简单地切断由position="dodge".

根据之前的评论,它需要先package:scales运行library(scales)

希望这可以帮助其他人,上面的答案只能让你分道扬镳。

于 2015-07-15T17:23:36.307 回答
12

根据之前共享的链接,这对我有用。

p + coord_cartesian(ylim=c(5,15))
于 2017-11-14T23:26:13.433 回答
1

这是一个社区 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列被替换为NAs。此行为取决于 的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

在此处输入图像描述

它的作用是用最近的限制替换限制之外的任何值,例如ymin0 变为 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})
于 2022-02-16T18:00:16.700 回答