我想把y和y画在同一个图上。

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

但当我这样画的时候,它们就不在同一个图上了。

在Matlab中是可以的,但有人知道在R中怎么做吗?


当前回答

我们也可以使用格库

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

对于特定的颜色

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

其他回答

您还可以在同一图形但不同的轴上使用par和plot。具体如下:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

如果你详细阅读了R中的par,你将能够生成真正有趣的图形。另一本书是Paul Murrel的《R Graphics》。

使用matplot函数:

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

如果y和y在相同的x点上求值,就用这个。它缩放y轴以适应哪个更大(y1或y2),不像这里的一些其他答案,如果y2大于y1,就会剪辑y2 (ggplot解决方案大多数都可以接受这一点)。

或者,如果两条线没有相同的x坐标,在第一个图上设置轴限制,并添加:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

我很惊讶这个Q已经4岁了,没有人提到matplot或x/ylim…

在构建多层图时,应该考虑ggplot包。这个想法是创建一个具有基本美学的图形对象,并逐步增强它。

Ggplot样式要求数据打包在data.frame中。

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

基本的解决方案:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

这里的+运算符用于向基本对象添加额外的层。

使用ggplot,您可以在绘图的每个阶段访问图形对象。比如,通常的一步一步设置是这样的:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

G生成图形,你可以在每个阶段看到它(至少在创建一个图层之后)。情节的进一步魅力也与创造的对象。例如,我们可以为坐标轴添加标签:

g <- g + ylab("Y") + xlab("X")
g

最后的g看起来像:

更新(2013-11-08):

正如评论中所指出的,ggplot的理念建议使用长格式的数据。 您可以参考这个答案以查看相应的代码。

Idiomatic Matlab plot(x1,y1,x2,y2)可以用ggplot2在R中翻译,例如:

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

灵感来自赵婷婷x轴范围不同的双线图使用ggplot2。

我认为你想要的答案是:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)