如何使用R在一个绘图上覆盖3个函数

如何使用R在一个绘图上覆盖3个函数,r,plot,R,Plot,我有三个函数和一个绘图代码: f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10} f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53} f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406

我有三个函数和一个绘图代码:

f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10}
f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53}
f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406*20}
到目前为止,这只会在绘图上生成f1,而不是f1和f2。我认为我采取了错误的方法,因为我正在制作另一个绘图,并试图将其添加到一个预先存在的绘图中。我不确定是否使用geom_线或类似的东西,只是覆盖它


是否有一种直接的方法来绘制多个功能并将它们叠加在同一个绘图中?

geom\u line
用于
ggplot2
,这是一种完全不同的绘图系统

如果从
plot()
开始,可以使用
lines()
在当前绘图上绘制线条。您的线条非常接近,因此在这里没有太大关系,但是对于base
plot
,您通常希望提前计算最大范围,以便可以从一开始就设置绘图窗口:

x = 1:1000
y1 = f1(x)
y2 = f2(x)
y3 = f3(x)

y_range = range(c(y1, y2, y3))

plot(x, y1, ylim = y_range, type="l", xlab="x", ylab="y", main="the plot :)", col = "red")
lines(x, y2, col = "blue")
lines(x, y3, col = "chartreuse")

ggplot2
用于处理数据帧中的数据,尤其是长格式数据帧。下面是我们如何使用
ggplot
解决这个问题。(请注意,与上述不同,
ggplot
自动计算绘图限制并给出一个漂亮的图例。)


或者像您的代码一样坚持基本R绘图,您只需使用
行添加额外的函数即可

plot(f1(1:1000), type="l", xlab="x", ylab="y", main="the plot :)")
lines(1:1000, f2(1:1000))
lines(1:1000, f3(1:1000))

如果想要两个相邻的绘图,则必须设置调色板的参数。在png()命令之后使用par(mfrow=c(1,2))


对于函数,您也可以使用
曲线

f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10}
f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53}
f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406*20}

c0 <- 1
c <- 1000
curve(f1, c0, c, main = 'the plot :)', xlab = 'x', ylab = 'y')
curve(f2, c0, c, add = T)
curve(f3, c0, c, add = T)

最后,您可能还对
facet\u grid
感兴趣:

map_df(list(f1 =f1,f2 =  f2,f3 = f3), exec, 1:1000)%>%
  mutate(x = 1:1000)%>%
  gather(key = fx,value = value, -x)%>%
  ggplot(aes(x = x, y = value)) + geom_line() +
  facet_grid(rows = vars(fx))

png("figure.png")
par(mfrow=c(1,2))
plot(f1(1:1000), type="l", xlab="x", ylab="y", main="the plot :)")
plot(f2(1:1000), type="l", xlab="x", ylab="y", add = T)
dev.off()
f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10}
f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53}
f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406*20}

c0 <- 1
c <- 1000
curve(f1, c0, c, main = 'the plot :)', xlab = 'x', ylab = 'y')
curve(f2, c0, c, add = T)
curve(f3, c0, c, add = T)
#or with ggplot / geom_line
library(tidyverse)

map_df(list(f1 =f1,f2 =  f2,f3 = f3), exec, 1:1000)%>%
  mutate(x = 1:1000)%>%
  gather(key = fx,value = value, -x)%>%
  ggplot(aes(x = x, y = value, col = fx)) + geom_line() 
map_df(list(f1 =f1,f2 =  f2,f3 = f3), exec, 1:1000)%>%
  mutate(x = 1:1000)%>%
  gather(key = fx,value = value, -x)%>%
  ggplot(aes(x = x, y = value)) + geom_line() +
  facet_grid(rows = vars(fx))