繁体   English   中英

如何使用 ggplot2 中的不同映射将 function 添加到散点 plot

[英]How to add a function to a scatter plot with different mappings in ggplot2

我有一个小数据集,可以用指数 function 很好地描述,如果我首先使用对数变换获得适当的起始值,我可以求解这个函数的参数:

x <- c(seq(from = 10, to = 200, by = 10), seq(from = 230, to = 590, by = 30))
y <- c(32.403, 38.832, 46.023, 59.895, 75.385, 98.283, 134.474, 186.62, 243.293,
       307.713, 383.845, 468.155, 567.619, 684.183, 810.969, 969.507, 1135.038,
       1320.475, 1530.365, 1757.032, 2587.402, 3633.337, 4939.983, 6526.32, 8436.739,
       10679.428, 13280.434, 16259.746, 19651.199, 23636.122, 27849.712, 32704.141, 38291.655)

simulationData <- data.frame(x = x, y = y)
model.0 <- lm(log(y) ~ x, data=simulationData)
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2])
model <- nls(y ~ a * exp(b * x), data = simulationData, start = start)
qplot(x, y, data = augment(model)) + geom_line(aes(y = .fitted)) +
  theme(text = element_text(size=20), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

在此处输入图像描述

然而,这个qplot命令只绘制我拥有的相对有限的 x 值向量的拟合值,因此曲线实际上只是由线段组成,看起来并不平滑。

我可以生成更精细的 x 值网格,并使用从 nls model 到 plot 的参数平滑的 function:

dense_x <- seq(0.1, 600, by = 0.1)
df <- data.frame(dense_x)
ggplot(df,aes(dense_x))+
  stat_function(fun=function(dense_x) 10.34436 * exp(0.00719 * dense_x)) +
  theme(text = element_text(size=20), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  theme_bw()

在此处输入图像描述

但我不知道如何组合这两个图,因为它们有单独的映射(一个是原始数据,我想将其作为点包含在 plot 中,另一个是曲线拟合的数据,我只想用到plot这个功能)。

有谁知道生成这样的 plot 的适当方法。 也许有一种方法可以仅标记要包含在geom_point()调用中的 x 值的子集?

谢谢!

您应该能够将数据分配和 x/y 值从 ggplot 移动到您想要的几何图形 plot。 因此,可以为每个单独的几何图形分配不同的数据和美学,而不是全局继承它们。 这样你就可以组合不同的图——即使是相同类型的 geom 层:

ggplot() +
geom_scatter(df1, aes(x1, y1)) +
geom_scatter(df2, aes(x2, y2))

或者,正如您在评论中建议的那样,您可以在现有的 plot 中添加一个不同的层,您在 ggplot() function 中定义了数据和映射,并简单地为这个新层指定一个新的数据集和映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM