我想修改ggplot2上的y轴比例,以绘制我一直知道为正的值。
为了说明此问题,请考虑在绘制时生成的图形:
df = data.frame(x=seq(1,10),y=rep(0,10))
ggplot(df,aes(x,y)) + geom_point()
Run Code Online (Sandbox Code Playgroud)

我想在这种情况下将y轴的下限设置为0,而不指定y轴的最大值。如果可能的话,我想这样做在一个命令(因为我需要通常所说的facet_grid用scales = free后,我创建这个图)
编辑
澄清后,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
Run Code Online (Sandbox Code Playgroud)
添加一个适当绘制全零数据的包装器:
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)
Run Code Online (Sandbox Code Playgroud)
如果所有数据的 y 值均为 0,则使用一个简单的函数将 y 轴上限设置为 1。如果任何 y 值非零,则将 y 轴最小值设置为 0,并确定最大值内部由ggplot. 您可以通过将语句的“else”部分更改ifelse为 1 以外的值来根据需要更改 y-max 值。另外,如果您不想弄乱参数expand而只想使用默认值,则可以使用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)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用手动设置的比例,但这不适用于facet_wrap或grid_wrap,因为它会设置所有方面的比例:
scale_y_continuous(limits=c(0, max(df$y) * 1.1))
Run Code Online (Sandbox Code Playgroud)