在同一图中绘制两个图形

Plot two graphs in a same plot

提问人:Sandra Schlichting 提问时间:4/2/2010 最后编辑:M--Sandra Schlichting 更新时间:2/24/2023 访问量:1830257

问:

我想在同一图中绘制 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中可以做到,但是有谁知道如何在R中做到这一点?hold on

ggplot2 R-FAQ

评论

5赞 isomorphismes 3/14/2015
退房。用。?curveadd=TRUE
0赞 Axeman 7/24/2018
有关更具体的 ggplot2 答案,请参阅此问题

答:

722赞 bnaul 4/2/2010 #1

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

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

评论

12赞 Frank 6/6/2013
为什么它在下面的简单示例中不起作用?> plot(sin) > lines(cos) as.double(y) 中的错误:无法将类型“builtin”强制转换为类型“double”的向量
26赞 Soumendra 7/9/2013
这很容易看出。使用 plot(sin),您传递的是函数而不是实际数据。plot() 将检测到这一点,然后使用 plot.function() 来绘制您的函数(阅读 multiple dispatch 以了解更多信息)。但是,lines.function() 没有定义,所以 lines() 不知道如何处理类函数的参数。行只能处理类 TS 的数据和时间序列对象。
37赞 isomorphismes 3/14/2015
@Frank 这样做: .plot(sin); curve(cos, add=TRUE)
2赞 Kavipriya 10/21/2015
如果 x 不同,如何使用相同?假设,我有一个图的 x1 和 y1,并在同一图中添加另一个 x2 和 y2 的图。x1 和 x2 的范围相同,但值不同。
3赞 hertzsprung 1/7/2016
添加图例的最直接方法是什么?
18赞 mcabral 4/2/2010 #2

如果您使用的是基础图形(即不是格子/网格图形),则可以通过使用点/线/多边形函数来模拟 MATLAB 的保持功能,从而在不开始新绘图的情况下向绘图添加其他细节。在多图布局的情况下,您可以使用它来选择要添加内容的图。par(mfg=...)

257赞 4 revs, 4 users 70%Sam #3

您还可以在同一图形上使用和绘制不同的轴。内容如下:par

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

如果您详细阅读 ,您将能够生成非常有趣的图表。另一本值得一看的书是 Paul Murrel 的 R Graphics。parR

评论

3赞 Alessandro Jacopson 6/28/2011
我的 R 给了我一个错误:par(fig(new = TRUE)) 中的错误:找不到函数“fig”
8赞 Alessandro Jacopson 6/5/2012
您的方法是否为两个图保留了正确的比例(y 轴)?
1赞 Sam 9/23/2012
@uvts_cvs 是的,它保留了原始图形。
15赞 isomorphismes 11/19/2013
这样做的问题是它会重写几个情节元素。我会在第二个中包括其他一些人.xlab="", ylab="", ...plot
0赞 stats_noob 1/11/2021
如果你有时间,你能看看我的问题吗?stackoverflow.com/questions/65650991/......谢谢
11赞 cranberry 7/3/2012 #4

与其将要绘制的值保留在数组中,不如将它们存储在矩阵中。默认情况下,整个矩阵将被视为一个数据集。但是,如果在图中添加相同数量的修饰符,例如 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")

除非数据集的大小不同,否则这应该有效。

评论

0赞 baouss 5/7/2019
这给出: if (as.factor) { 中的错误:参数不可解释为逻辑
18赞 brainstorm 10/21/2012 #5

也就是说,您可以将点用于过图。

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

points(x2,y2,col='blue')
145赞 redmode 1/28/2013 #6

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

ggplotstyle 要求将数据打包在 中。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生成绘图,您可以在每个阶段看到它(好吧,在创建至少一个图层之后)。剧情的进一步附魔也是用创建的对象制作的。例如,我们可以为 axises 添加标签:

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

最终的样子是:g

enter image description here

更新 (2013-11-08):

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

评论

5赞 krlmlr 9/27/2013
正如 Henrik 所建议的那样,数据确实应该采用“长”格式,比您使用的“宽”格式更自然地处理它。ggplot
1赞 krlmlr 9/27/2013
@Henrik:不,首先感谢您的回答。也许这个答案的作者可以编辑它,使其与哲学相吻合......ggplot
3赞 Dan 3/7/2017
教我在 ggplot(aes()) 上定义 x,然后在 geom_*() 上定义 y。好!
23赞 Henrik 9/27/2013 #7

如@redmode所述,您可以使用 在同一图形设备中绘制两条线。在该答案中,数据采用“宽”格式。但是,在使用时,通常最方便的做法是将数据以“长”格式保存在数据框中。然后,通过在理论参数中使用不同的“分组变量”,线条的属性(例如线型或颜色)将根据分组变量而变化,并出现相应的图例。ggplotggplotaes

在这种情况下,我们可以使用美学,它将线条的颜色与数据集中变量的不同级别相匹配(此处:y1 与 y2)。但首先,我们需要将数据从宽格式融化为长格式,例如使用包中的“melt”函数。下面介绍了重塑数据的其他方法:将 data.frame 从宽格式调整为长格式colourreshape2

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

11赞 Mateo Sanchez 1/22/2014 #8

您可以使用 plotly 包中的函数将此处的任何 gggplot2 示例转换为交互式绘图,但我认为这种绘图在没有 ggplot2 的情况下会更好:ggplotly()

# 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

评论

0赞 denis 6/2/2015
情节看起来很精彩;这是免费的吗?
0赞 Mateo Sanchez 6/4/2015
@denis,还有无限的免费公共绘图和付费私人绘图或本地选项。请参阅计划页面
5赞 Carson 1/8/2019
plotly R 包现在是 100% 免费和开源的(MIT 许可)。您可以在有或没有 plotly 帐户的情况下使用它。
0赞 stats_noob 1/11/2021
你能看看我的问题吗?stackoverflow.com/questions/65650991/......谢谢!
61赞 user3749764 6/18/2014 #9

我认为你要找的答案是:

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

评论

38赞 Waldir Leoncio 8/27/2014
这似乎不起作用,它会发出警告,然后只是在第一个图上打印第二个图。"add" is not a graphical parameter
8赞 Alessandro Jacopson 10/8/2014
@WaldirLeoncio看到 stackoverflow.com/questions/6789055/......
0赞 RMurphy 2/16/2017
这样做的一个很好的好处是,它似乎使轴限制和标题保持一致。前面的一些方法会导致 R 在 y 轴上绘制两组刻度线,除非您遇到指定更多选项的麻烦。毋庸置疑,在轴上有两组刻度线可能会非常具有误导性。
3赞 cloudscomputes 10/12/2017
add 参数适用于某些绘图方法,但不适用于 R 中的基本/默认方法
5赞 quepas 11/13/2017
我遇到了同样的错误。我的 R 是 .您可以在这些图之间使用命令。"add" is not a graphical parameterR version 3.2.3 (2015-12-10)par(new=TRUE)
40赞 Spacedman 8/18/2014 #10

使用以下函数:matplot

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

如果 和 在相同的点上进行评估,请使用此选项。它缩放 Y 轴以适合更大(或)的答案,这与这里的其他一些答案不同,如果它变得大于(ggplot 解决方案大多可以接受),它们就会被剪裁。y1y2xy1y2y2y1

或者,如果两条线的 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

评论

0赞 JASC 7/10/2021
这里的 range() 函数特别有用。
27赞 Hamed2005 10/21/2014 #11

如果要将绘图拆分为两列(2 个图彼此相邻),可以这样做:

par(mfrow=c(1,2))

plot(x)

plot(y) 

参考链接

34赞 isomorphismes 3/14/2015 #12

tl;dr:你想用(with)或。curveadd=TRUElines


我不同意,因为这会重复打印刻度线和轴标签。例如par(new=TRUE)

sine and parabola

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

这是 和 之间的最大区别。curvelines

curve将绘制一个函数,如 . 使用 x 和 y 值绘制点,例如:。curve(sin)lineslines( x=0:10, y=sin(0:10) )

这里有一个细微的区别:需要调用你正在尝试做的事情,同时已经假设你正在添加到现有情节中。curveadd=TRUElines

id & sine

这是调用 plot(0:2); curve(sin) 的结果。


在幕后,请查看 .并检查.当你调用 R 时,它会发现这是一个函数(不是 y 值)并使用该方法,该方法最终调用 .用于处理函数的工具也是如此。methods(plot)body( plot.function )[[5]]plot(sin)sinplot.functioncurvecurve

7赞 epo3 1/25/2017 #13

您还可以使用 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

13赞 Alessandro Jacopson 2/26/2018 #14

惯用的Matlab可以在R中翻译,例如:plot(x1,y1,x2,y2)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

5赞 Varn K 9/26/2018 #15

我们也可以使用格子库

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

7赞 Saurabh Chauhan 2/1/2019 #16

使用(从主 y 轴和次 y 轴添加解决方案 - 它似乎丢失了):plotlyplotly

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

评论

0赞 user9802913 6/13/2019
我编译了代码,但不起作用,首先在%>%中标记了一个错误,然后删除了它,然后标记了一个错误,为什么?Error in library(plotly) : there is no package called ‘plotly’
0赞 Saurabh Chauhan 6/13/2019
你安装了软件包吗?您需要使用 command 安装软件包。plotlyinstall.packages("plotly")
2赞 DiegoJArg 9/15/2022 #17

用于数学函数。 并使用 add=TRUE 使用相同的绘图和轴。curve

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