在 ggplot() 中为不同的 x 值范围绘制不同的模型
Posted
技术标签:
【中文标题】在 ggplot() 中为不同的 x 值范围绘制不同的模型【英文标题】:Plotting different models for different x value ranges in ggplot() 【发布时间】:2022-01-10 00:27:54 【问题描述】:我正在尝试为低 x 值显示线性模型,为更高 x 值显示非线性模型。为此,我将以 DNase 为例:
library(ggplot2)
#Assinging DNase as a new dataframe:
data_1 <- DNase
#Creating a column that can distinguish low and high range values:
data_1$range <- ifelse(data_1$conc <5, "low", "high")
#Attempting to plot separate lines for low and high range values, and also facet_wrap by run:
ggplot(data_1, aes(x = conc, y = density, colour = range)) +
geom_point(size = 0.5) + stat_smooth(method = "nls",
method.args = list(formula = y ~ a*exp(b*x),
start = list(a = 0.8, b = 0.1)),
data = data_1,
se = FALSE) +
stat_smooth(method = 'lm', formula = 'y~0+x') +
facet_wrap(~Run)
但是,正如您所看到的,它似乎同时绘制了线性模型和非线性模型,我无法完全弄清楚在哪里放置可以告诉它只为每个模型绘制一个的信息。另外,如果可能的话,我可以将这些模型扩展到 x 轴上的全部值范围吗?
【问题讨论】:
也许这可以修复 x 轴上的值范围? ***.com/questions/47667994/… 【参考方案1】:您可以为每个geom
提供特定数据。在这种情况下,使用子集 data_1
使用 range
仅向每个 stat_smooth()
调用提供相关数据(并将整个框架提供给 geom_point()
ggplot(NULL, aes(x = conc, y = density, colour = range)) +
geom_point(data = data_1, size = 0.5) +
stat_smooth(data = subset(data_1, range == "high"),
method = "nls",
method.args = list(formula = y ~ a*exp(b*x),
start = list(a = 0.8, b = 0.1)),
se = FALSE) +
stat_smooth(data = subset(data_1, range == "low"), method = 'lm', formula = 'y~0+x') +
facet_wrap(~Run)
如果您想在所有数据上拟合两个模型,则只需在 data_1
中手动计算并手动绘制。
【讨论】:
这看起来很棒,非常感谢您的帮助。不幸的是,当我运行此代码时,它给出了以下错误:错误:mapping
必须由aes()
创建运行rlang::last_error()
以查看错误发生的位置。 > rlang::last_error() mapping
必须由 aes()
创建 回溯: 1. ggplot2::geom_point(data_1, size = 0.5) 2. ggplot2::layer(...) 3. ggplot2:::validate_mapping(映射)geom_point()
中添加data = data1
。修复了@Cameron。以上是关于在 ggplot() 中为不同的 x 值范围绘制不同的模型的主要内容,如果未能解决你的问题,请参考以下文章