排除ggplot2中的负y轴值

时间:2014-10-24 23:07:30

标签: r ggplot2

我想修改ggplot2上的y轴刻度,以便我绘制一个我知道总是正值的值。

为了说明这个问题,请考虑我绘制时生成的图表:

df = data.frame(x=seq(1,10),y=rep(0,10))
ggplot(df,aes(x,y)) + geom_point()

enter image description here

我想在这种情况下将y轴的下限设置为0,而不指定y轴的最大值。如果可能的话,我想在一个命令中执行此操作(因为我需要在创建此图后通常使用facet_grid调用scales = free

2 个答案:

答案 0 :(得分:2)

  

修改

在澄清之后,OP正在寻找一种解决方案来绘制y值全部为零的数据,这样expand函数设置的轴在0的两边都不相等。这是一种可能的解决方案:

示例数据:

set.seed(1)

df <- data.frame(x=1:10,
                 y=rep(0, 10))
df1 <- data.frame(x=1:10,
                  y=sample(1:10 , 10, replace=T))
df
df1

添加一个适当地绘制全零数据的包装器:

plot.zeros <- function(data) {
  upper.lim <- ifelse(any(data$y != 0), NA, 1)
  print(ggplot(data, aes(x, y)) + geom_point() +
    scale_y_continuous(limits = c(0, upper.lim), expand = c(0.01, 0)))
}

plot.zeros(df)
plot.zeros(df1)

如果所有数据的y值均为0,则使用简单函数将上y轴限制设置为1.如果任何y值不为零,则将最小y轴设置为0并且最大值由ggplot在内部确定。您可以通过更改“其他”来更改y-max值。 ifelse语句的一部分,而不是1.除此之外,如果您不想弄乱expand参数并且只想使用默认值,则可以使用{{1}而不是ylim(0, upper.lim)来电。

  

结束编辑


如果您的数据始终为正数,但有时最小值大于零,则可以使用scale_y_continuous。在这种情况下,这应该给你你想要的东西:

expand_limits

enter image description here

或者,您可以使用手动设置的比例,但这不适用于df <- data.frame(type=sample(c("a","b"), 20, replace=T), x=rep(1:10, 2), y=c(rep(0, 10), sample(1:10 , 10, replace=T))) df ggplot(df,aes(x,y)) + geom_point() + facet_wrap(facets='type', scales="free") + expand_limits(y=0) facet_wrap,因为它会设置所有方面的比例:

grid_wrap

答案 1 :(得分:2)

与希望扩展所有轴以包含值的this question不同,您希望排除否则将在轴上的值。

这种情况的一般情况(设定固定的上限或下限,并允许以通常的方式确定另一个)是不可能的,而feature request had been filed for it 是{{3}并且可以通过指定一个固定限制并使用NA用于从数据中确定的另一个限制来使用(感谢@ Cotton.Rockwood指出这一点)。