我想在同一张图中绘制y1和y2。
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中,可以使用hold on
实现此功能,但是有人知道如何在R中实现吗?
lines()
或points()
会添加到现有的图形中,但不会创建一个新窗口。因此,您需要执行下面的操作:
plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
plot(sin) lines(cos) as.double(y)的错误: 无法将'type'内置类型强制转换为'double'类型的向量- Frank
plot(sin); curve(cos, add=TRUE)
。 - isomorphismes你也可以使用 par
在同一图表上但不同轴上绘制。如下所示:
plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )
如果你仔细阅读关于R
中的par
的资料,你将能够生成非常有趣的图形。另一本值得一看的书是Paul Murrel的R Graphics。
在构建多层图时,应考虑使用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
的理念建议使用长格式的数据。
您可以参考这个答案以查看相应的代码。
ggplot
的理念... - krlmlr我认为你正在寻找的答案是:
plot(first thing to plot)
plot(second thing to plot,add=TRUE)
使用matplot
函数:
matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))
如果y1
和y2
在相同的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")
我很惊讶这个问题已经存在4年了,竟然没有人提到matplot
或x/ylim
...
简而言之:您想使用curve
(带有add=TRUE
)或lines
。
我不同意使用par(new=TRUE)
,因为这会导致刻度线和轴标签重复打印。例如:
plot(sin); par(new=T); plot( function(x) x**2 )
的输出结果。
看看垂直轴标签是多么混乱!由于范围不同,您需要设置ylim=c(两个函数之间最低点, 两个函数之间最高点)
,这比我将要向您展示的方式更加困难——如果您想添加不止两条曲线,那就更加困难了。
让我困惑的一点是绘图中curve
和lines
之间的区别。(如果您记不住这两个重要的绘图命令的名称,可以唱出来。)
curve
和lines
之间的主要区别在于:curve
会绘制一个函数,例如curve(sin)
。而lines
则绘制具有x和y值的点,例如:lines( x=0:10, y=sin(0:10) )
。
这里还有一个小区别:对于您要做的事情,curve
需要使用add=TRUE
进行调用,而lines
则默认假定您正在添加到现有的绘图中。
这是调用plot(0:2); curve(sin)
的结果。
在幕后,查看一下methods(plot)
。并且检查body( plot.function )[[5]]
。当您调用plot(sin)
时,R会发现sin
是一个函数(而不是y值),然后使用plot.function
方法,最终调用curve
。因此,curve
是处理函数的工具。
根据 @redmode 的描述,您可以使用 ggplot
在同一图形设备中绘制这两行。在那个答案中,数据格式是“宽”的。然而,使用 ggplot
时,通常最方便的方法是将数据保留在数据框中的“长”格式。然后,通过在 aes
主题参数中使用不同的“分组变量”,线的属性(例如线型或颜色)将根据分组变量而变化,并相应的图例将出现。
在这种情况下,我们可以使用color
主题参数,将线的颜色与数据集中一个变量的不同水平相匹配(此处为 y1 vs y2)。但首先,我们需要使用例如来自 reshape2
包的函数 'melt' 将数据从宽转换为长格式。有关重塑数据的其他方法在此处描述:Reshaping data.frame from wide to long format。
library(ggplot2)
library(reshape2)
# original data in a 'wide' format
x <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)
# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")
# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()
你可以使用数据点进行覆盖绘图。
plot(x1, y1,col='red')
points(x2,y2,col='blue')
如果你使用的是基础图形(即非格子/网格图形),那么你可以通过使用点/线/多边形函数向绘图中添加其他细节而不启动新绘图来模仿MATLAB的hold on功能。在多图布局的情况下,你可以使用par(mfg=...)
选择添加元素的图。
?curve
。使用参数add=TRUE
。 - isomorphismes