在R的同一个图中画两个图

我想把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中可以做hold on,但有人知道在R中怎么做吗?

1751475 次浏览

lines()points()将添加到现有的图形中,但不会创建新的窗口。所以你需要这么做

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

如果您使用的是基础图形(即不是晶格/网格图形),那么您可以通过使用点/线/多边形函数来模拟MATLAB的保持特性,从而在不开始新的图形的情况下为图形添加额外的细节。在多图布局的情况下,您可以使用par(mfg=...)来选择将内容添加到哪个图。

您还可以使用par并在同一个图形上绘制不同的轴。具体如下:

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

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

与其将要绘制的值保存在数组中,不如将它们存储在矩阵中。默认情况下,整个矩阵将被视为一个数据集。然而,如果你在图中添加相同数量的修饰符,例如col(),就像你在矩阵中有行一样,R会发现每一行都应该被独立对待。例如:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

这应该可以工作,除非您的数据集大小不同。

也就是说,你可以在overplot中使用点。

plot(x1, y1,col='red')


points(x2,y2,col='blue')

在构建多层图时,应该考虑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

这里+ operator用于为基本对象添加额外的图层。

使用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看起来像:

enter image description here

更新(2013-11-08):

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

正如@redmode所描述的,您可以使用ggplot在同一个图形设备中绘制这两条线。在这个回答中,数据是“宽”格式的。然而,当使用ggplot时,通常最方便的是将数据以“长”格式保存在数据帧中。然后,通过在aesthetics参数中使用不同的“分组变量”,线的属性,如线类型或颜色,将根据分组变量而变化,并且相应的图例将出现。

在这种情况下,我们可以使用colour美学,它将线条的颜色匹配到数据集中变量的不同级别(这里:y1 vs y2)。但是首先我们需要将数据从宽格式转换为长格式,例如使用reshape2包中的'melt'函数。这里描述了重塑数据的其他方法:将data.frame从宽格式调整为长格式

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()

enter image description here

你可以使用情节包中的ggplotly()函数将任何gggplot2示例转换为交互式图形,但我认为这种类型的图形没有ggplot2会更好:

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)


plot_ly(x = x) %>%
add_lines(y = y1, color = I("red"), name = "Red") %>%
add_lines(y = y2, color = I("green"), name = "Green")

enter image description here

我认为你想要的答案是:

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))

如果y1y2在相同的x点上计算,则使用此方法。它缩放y轴以适应哪个更大(y1y2),不像这里的一些其他答案,如果它比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岁了,没有人提到matplotx/ylim

如果你想把图分成两列(2个相邻的图),你可以这样做:

par(mfrow=c(1,2))


plot(x)


plot(y)

参考链接

你想要使用curve(与add=TRUE)或lines


我不同意par(new=TRUE),因为它会重复打印标记和轴标签。如

正弦和抛物线

plot(sin); par(new=T); plot( function(x) x**2 )的输出。

看看纵轴标签有多乱!由于范围是不同的,你需要设置ylim=c(lowest point between the two functions, highest point between the two functions),这比我将要展示给你的不那么简单,如果你想添加的不仅仅是两条曲线,而是许多条曲线,那么道路就不那么简单了。


对于绘图,我总是感到困惑的是curvelines之间的区别。# EYZ2

curvelines之间有一个很大的区别。

curve将像curve(sin)一样绘制一个函数。lines用x和y值绘制点,如:lines( x=0:10, y=sin(0:10) )

这里有一个微小的区别:curve需要与add=TRUE一起调用,而lines已经假设您正在添加到现有的plot中。

id &正弦”></p>


<p><em>下面是调用<code>plot(0:2); curve(sin)</code>的结果。</em></p>


<hr>


<p>在幕后,看看<code>methods(plot)</code>。检查<code>body( plot.function )[[5]]</code>。当您调用<code>plot(sin)</code>时,R发现<code>sin</code>是一个函数(而不是y值),并使用<code>plot.function</code>方法,最终调用<code>curve</code>。因此,<code>curve</code>是用来处理函数的工具。</p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

你也可以使用ggvis创建你的情节:

library(ggvis)


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


df %>%
ggvis(~x, ~y1, stroke := 'red') %>%
layer_paths() %>%
layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

这将创建以下情节:

enter image description here

例如,Idiomatic Matlab plot(x1,y1,x2,y2)可以用R翻译成ggplot2,如下所示:

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))

enter image description here

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

我们也可以使用格库

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"))))

enter image description here

使用plotly(从plotly添加溶液,主要和次要y轴-它似乎缺失):

library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)


df=cbind.data.frame(x,y1,y2)


plot_ly(df) %>%
add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
layout(title = 'Title',
xaxis = list(title = "X-axis title"),
yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

工作演示截图:

enter image description here

数学函数使用curve。 并使用add=TRUE使用相同的绘图和轴
curve( log2 , to=5     , col="black", ylab="log's(.)")
curve( log  , add=TRUE , col="red" )
curve( log10, add=TRUE , col="blue" )
abline( h=0 )

enter image description here