绘制指数函数 returns 多余的线
Plotting exponential function returns excess lines
我正在尝试对一组数据进行非线性回归。然而,绘制时,R returns 许多不同的线,而应该只有一条线。
这个问题只能在一组数据中重现,我看不出这个数据和其他数据有什么明显的区别。
这是我的剧情代码:
plot(df$logFC, df$log_pval,
xlim=c(0,11.1), ylim=c(0,11),
xlab = "logFC", ylab = "p_val")
c <- df$logFC
d <- df$log_pval
model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
lines(c, predict(model), col = "dodgerblue", lty = 2, lwd = 2)
这是我的数据样本 (df):
logFC log_pval
4.315 2.788
6.724 9.836
2.925 4.136
5.451 10.836
2.345 1.486
4.219 7.618
我已将问题缩小到模型,但我不确定从那里去哪里。非常感谢任何帮助!
可以用ggplot
来实现。如果需要,可以向情节添加更多自定义。
library(ggplot2)
ggplot(df) + aes(x = logFC, y = log_pval) + geom_point() +
geom_line(aes(x = c, y = predict(model)))
数据
df <- structure(list(logFC = c(4.315, 6.724, 2.925, 5.451, 2.345, 4.219
), log_pval = c(2.788, 9.836, 4.136, 10.836, 1.486, 7.618)), class =
"data.frame", row.names = c(NA, -6L))
c <- df$logFC
d <- df$log_pval
model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
1) ggplot
方法
我尝试使用 ggplot2
绘制数据图表,我认为输出更符合您的预期...
library(tibble)
library(ggplot2)
library(dplyr)
# Create dataset
df <- tibble::tribble(~logFC, ~log_pval,
4.315, 2.788,
6.724, 9.836,
2.925, 4.136,
5.451, 10.836,
2.345, 1.486,
4.219, 7.618)
# Extract some vectors
c <- df$logFC
d <- df$log_pval
# Your model
model <- nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
# Create second dataset for new plotting
df2 <- tibble(logFC = c, log_pval =predict(model))
# Plot output
ggplot() +
geom_line(data = df2, aes(x = logFC, y = log_pval)) +
geom_point(data = df, aes(x =logFC, y =log_pval)) +
theme_classic()
2) base
方法
如果你想坚持 base
尝试在绘制线条之前对数据框中的 x
变量进行排序:
plot(df$logFC, df$log_pval,
xlab = "logFC", ylab = "p_val")
df3 <- tibble(x = df$logFC, y = predict(model)) %>% dplyr::arrange(x)
lines(df3$x, df3$y, col = "dodgerblue", lty = 1, lwd = 1)
感谢 Klink 和 Ronak 的帮助,
事实证明问题是数据未按大小排序,因此 'points' 根据预测的 y 轴绘制了未排序的 x 轴,导致预测数据之间出现锯齿形。
因为 ggplot 可能会在绘图之前重新排序数据,所以这个问题已经解决。
我正在尝试对一组数据进行非线性回归。然而,绘制时,R returns 许多不同的线,而应该只有一条线。
这个问题只能在一组数据中重现,我看不出这个数据和其他数据有什么明显的区别。
这是我的剧情代码:
plot(df$logFC, df$log_pval,
xlim=c(0,11.1), ylim=c(0,11),
xlab = "logFC", ylab = "p_val")
c <- df$logFC
d <- df$log_pval
model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
lines(c, predict(model), col = "dodgerblue", lty = 2, lwd = 2)
这是我的数据样本 (df):
logFC log_pval
4.315 2.788
6.724 9.836
2.925 4.136
5.451 10.836
2.345 1.486
4.219 7.618
我已将问题缩小到模型,但我不确定从那里去哪里。非常感谢任何帮助!
可以用ggplot
来实现。如果需要,可以向情节添加更多自定义。
library(ggplot2)
ggplot(df) + aes(x = logFC, y = log_pval) + geom_point() +
geom_line(aes(x = c, y = predict(model)))
数据
df <- structure(list(logFC = c(4.315, 6.724, 2.925, 5.451, 2.345, 4.219
), log_pval = c(2.788, 9.836, 4.136, 10.836, 1.486, 7.618)), class =
"data.frame", row.names = c(NA, -6L))
c <- df$logFC
d <- df$log_pval
model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
1) ggplot
方法
我尝试使用 ggplot2
绘制数据图表,我认为输出更符合您的预期...
library(tibble)
library(ggplot2)
library(dplyr)
# Create dataset
df <- tibble::tribble(~logFC, ~log_pval,
4.315, 2.788,
6.724, 9.836,
2.925, 4.136,
5.451, 10.836,
2.345, 1.486,
4.219, 7.618)
# Extract some vectors
c <- df$logFC
d <- df$log_pval
# Your model
model <- nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
# Create second dataset for new plotting
df2 <- tibble(logFC = c, log_pval =predict(model))
# Plot output
ggplot() +
geom_line(data = df2, aes(x = logFC, y = log_pval)) +
geom_point(data = df, aes(x =logFC, y =log_pval)) +
theme_classic()
2) base
方法
如果你想坚持 base
尝试在绘制线条之前对数据框中的 x
变量进行排序:
plot(df$logFC, df$log_pval,
xlab = "logFC", ylab = "p_val")
df3 <- tibble(x = df$logFC, y = predict(model)) %>% dplyr::arrange(x)
lines(df3$x, df3$y, col = "dodgerblue", lty = 1, lwd = 1)
感谢 Klink 和 Ronak 的帮助,
事实证明问题是数据未按大小排序,因此 'points' 根据预测的 y 轴绘制了未排序的 x 轴,导致预测数据之间出现锯齿形。
因为 ggplot 可能会在绘图之前重新排序数据,所以这个问题已经解决。