我想修改ggplot2上的y轴刻度,以便我绘制一个我知道总是正值的值。
为了说明这个问题,请考虑我绘制时生成的图表:
df = data.frame(x=seq(1,10),y=rep(0,10))
ggplot(df,aes(x,y)) + geom_point()
我想在这种情况下将y轴的下限设置为0,而不指定y轴的最大值。如果可能的话,我想在一个命令中执行此操作(因为我需要在创建此图后通常使用facet_grid
调用scales = free
)
答案 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
或者,您可以使用手动设置的比例,但这不适用于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指出这一点)。