R ggplot2 scale_y_continuous:如何将刻度标签和限制值组合起来?

9
问题:我找不到任何方法在ggplot2中结合断点和限制命令。y轴应始终包含0-40的范围,breaks=c(5,10,15,20,25,30,35)。x轴应为0-100,breaks=c(10,20,30,40,50,60,70,80,90,100)。我不想显示超出此范围的数据。

我尝试了+ ylim,但这会覆盖我的断点。 我尝试了+ expand,但这也显示了我不想要的范围之外的数据(1-100)。 我尝试了在第二步添加断点和限制范围,但如果这样做,我的第一步的y轴就会被简单地覆盖。

plot_Tili_Age_VS_Height <- ggplot(Tili, aes(x = Age, y = Height)) + geom_point() + 
  geom_smooth(method = "lm", se = FALSE, color = "black", formula = y ~ x) + 
  scale_y_continuous(trans = "log10", breaks = c(5, 10, 15, 20, 25, 30, 35)) + 
  expand_limits(y = c(0, 35), x = c(0, 100)) + 
  scale_x_continuous(trans = "log10", breaks = c(10, 20, 30, 40, 50, 60,70, 80, 90, 100)) +
  theme_bw(base_size = 15) + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

df <- data.frame(x = log(Tili$Age), y = log(Tili$Height))
lm_eqn = function(df) {
  m = lm(y ~ x, df)
  eq <- substitute(ln(italic(y)) == a + b %*% ln(italic(x)) * "," ~ ~italic(r)^2 ~ 
                     "=" ~ r2, list(a = format(coef(m)[1], digits = 2), 
                                    b = format(coef(m)[2], digits = 2), 
                                    r2 = format(summary(m)$r.squared, digits = 2)))
  as.character(as.expression(eq))
}

plot_Tili_Age_VS_Height <- plot_Tili_Age_VS_Height + 
  annotate("text", x = 30, y = 5, label = lm_eqn(df), hjust = 0, 
           size = 3, family = "Times", parse = TRUE)
plot_Tili_Age_VS_Height 

有什么办法可以修复它吗?

1
“Tili”是内置数据集吗?您能否使其可复制给其他人? - JasonAizkalns
1
你尝试过在scale_x_continuous中使用limits参数吗? - aosmith
摆脱 expand_limits(),不要使用 ylimxlim,只需使用 scale_y_continuousscale_x_continuous,它们都接受 breakslimits 参数。 - Gregor Thomas
@JasonAizkalns 我尝试制作一个可重现的示例,但我的代码在使用其他数据时不再起作用。对此我感到很抱歉!:( 然而,我认为在我的示例中数据是无关紧要的,问题在于ggplot语法不允许我同时组合limits =和breaks =,所以我想没有数据也应该没问题。 - Baycat
@aosmith 是的,我做了。它还覆盖了换行符。 - Baycat
@Gregor 是的,它们确实需要参数,但如果我同时使用limits和breaks,R会设置一些随机的断点而不是使用我的设定,我无法弄清原因。 - Baycat
1个回答

12

正如JasonAizkalns评论的那样,如果没有可重现的示例,无法解决您的问题。下面的代码在鸢尾花数据上完成了您想要的功能,并且应该也适用于您的示例。

library(ggplot2)

df <- iris


## all data, default breaks
ggplot(df, aes(Sepal.Length, Sepal.Width)) +
  geom_point()

## subset of data is seen in plot, breaks changed
ggplot(df, aes(Sepal.Length, Sepal.Width)) +
  geom_point() + 
  scale_x_continuous(breaks = c(5.5,6.5), limits = c(5,7)) +
  scale_y_continuous(breaks = c(3.5,2.5), limits = c(2,4))

1
谢谢,突然间成功地将断点和限制结合起来了,尽管我运行的是昨天相同的代码(并且在之间重新启动了程序)。可能重新启动计算机就解决了问题。所以scale_x_continuous(breaks = c(5.5,6.5), limits = c(5,7))就是解决方案!如果像我一样使用对数转换数据,则需要记住的是,如果您只是简单地放置c(0,40)或类似的值,则您的数据可能会显示得非常小,因为从0到第一个断点(在我的情况下为10)的距离很大,最好使用您的数据的实际底限(在我的情况下为4.4)。 - Baycat
2
当编辑y轴以显示对数10刻度时,这将如何工作?我正在指定trans、breaks和labels,但也想略微增加y轴范围,使其超出自身绘制的范围。我希望我的y轴跨越从0.5到3.5(以log10为单位)。如何将限制条件纳入此代码块中?scale_y_continuous(trans = log10_trans(), breaks = trans_breaks('log10', function(x) 10^x), labels = trans_format('log10', math_format(.x))) - user42485

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接