【问题标题】:How to set just one limit for axes in ggplot2 with facets? [duplicate]如何在 ggplot2 中为带有刻面的轴设置一个限制? [复制]
【发布时间】:2026-01-23 15:50:01
【问题描述】:

这个问题与这个问题类似:How to set limits for axes in ggplot2 R plots?,不同之处在于我想限制 仅一侧(例如,仅绘制 x>0 而不是 -5000 facets。

注意,我想知道这两种简单情况的解决方案:

  1. scale_x_continuous(limits = c(-5000, 5000))(与xlim(-5000, 5000) 相同) - 它完全不考虑积分(例如,它们不会用于geom_smooth())

  2. coord_cartesian(xlim = c(-5000, 5000)) 函数 - 它根本不绘制它们(但仍用于 geom_smooth())

当您使用 facet_wrap(~veg, scales = "free_x) 并且不知道每个方面的 x 上限是多少时,这种情况经常发生,但您知道它们总是积极的。

【问题讨论】:

  • 你应该包括一个例子,大概不同的方面应该以不同的最大值结束(否则它是微不足道的)。
  • 只需设置限制 = c(-5000, NA) 。这适用于坐标和比例函数
  • 这能回答你的问题吗? set only lower bound of a limit for ggplot
  • 这里最简单的答案已经在上面的 cmets 中了:@Tjebo,你应该发布它。像魅力一样工作。
  • @chemdork123 欢呼。已添加答案

标签: r ggplot2


【解决方案1】:

使用 NA 单边设置限制。适用于 coord_scale_ 函数

我通常更喜欢 coord_,因为它不会删除数据。对于下面的示例,您还需要删除 0 处的边距,例如随着扩大。

library(ggplot2)    

carrots <- data.frame(length = rnorm(500000, 10000, 10000))
cukes <- data.frame(length = rnorm(50000, 10000, 20000))
carrots$veg <- 'carrot'
cukes$veg <- 'cuke'
vegLengths <- rbind(carrots, cukes)

ggplot(vegLengths, aes(length, fill = veg)) +
  geom_density(alpha = 0.2) +
  scale_x_continuous(limits = c(0, NA))
#> Warning: Removed 94542 rows containing non-finite values (stat_density).


ggplot(vegLengths, aes(length, fill = veg)) +
  geom_density(alpha = 0.2) +
  coord_cartesian(xlim = c(0, NA))

reprex package (v0.3.0) 于 2020 年 4 月 30 日创建

使用展开删除边距。也可能是单方面的。右边距设置为连续轴的默认多重扩展 0.05。

ggplot(vegLengths, aes(length, fill = veg)) +
  geom_density(alpha = 0.2) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.05))) +
  coord_cartesian(xlim = c(0, NA))

【讨论】:

    【解决方案2】:

    你可以试试

    scale_x_continuous(limits = c(0, max(x)))
    

    这会将下限设置为零,上限设置为数据的最大值。这就是你要找的东西吗?

    【讨论】:

    • 这是我最终使用的构面。谢谢!
    • 我收到消息“找不到对象 x”。有没有办法避免使用 max(data$var) 而实际使用 x?