在R中的相同图中绘制两个图

San*_*ing 529 plot r ggplot2 r-faq

我想在同一个图中绘制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")
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做的时候,它们并没有被绘制在同一个地块中.

在Matlab中可以做到hold on,但有人知道如何在R中做到这一点吗?

bna*_*aul 575

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

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
Run Code Online (Sandbox Code Playgroud)

  • @Frank这样做:`plot(sin); 曲线(cos,add = TRUE)`. (26认同)
  • 这很容易看到.使用plot(sin),您传递的是函数而不是实际数据.plot()将检测到这一点,然后使用plot.function()绘制您的函数(读取多个调度以了解更多信息).但是,没有定义lines.function(),因此lines()不知道如何处理类函数的参数.行只能处理类ts的数据和时间序列对象. (23认同)
  • 为什么它不能在以下简单示例中起作用?> plot(sin)> lines(cos)as.double(y)中的错误:无法将'builtin'强制类型为'double'类型的向量 (10认同)
  • 如果x不同,如何使用相同的?比方说,我有一个图的x1和y1,并在同一个图中添加另一个x2和y2图.x1和x2都具有相同的范围但不同的值. (2认同)
  • 向其中添加图例的最直接方法是什么? (2认同)

Sam*_*Sam 205

您也可以par在同一图表上使用和绘图,但不同的轴.如下:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )
Run Code Online (Sandbox Code Playgroud)

如果您详细介绍一下阅读parR,你就能够产生非常有趣的图表.另一本值得关注的书是Paul Murrel的R Graphics.

  • 这个问题是它会重写几个绘图元素.我会在第二个'plot`中包含`xlab ="",ylab ="",......以及其他几个. (9认同)
  • 您的方法是否为两个图保留了正确的比例(y轴)? (5认同)
  • 我的R给了我一个错误:par中的错误(图(新= TRUE)):找不到函数"fig" (3认同)

red*_*ode 110

在构建多层图时,应考虑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)
Run Code Online (Sandbox Code Playgroud)

基本解决方案

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
Run Code Online (Sandbox Code Playgroud)

这里+ 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
Run Code Online (Sandbox Code Playgroud)

g生成绘图,您可以在每个阶段(在创建至少一个图层之后)看到它.绘图的进一步附魔也是用创建的对象进行的.例如,我们可以为轴添加标签:

g <- g + ylab("Y") + xlab("X")
g
Run Code Online (Sandbox Code Playgroud)

最终g看起来像:

在此输入图像描述

更新(2013-11-08):

正如评论中指出的那样,ggplot哲学建议使用长格式的数据.您可以参考此答案/sf/answers/1332736611/以查看相应的代码.

  • 正如[Henrik建议](http://stackoverflow.com/a/19038732/946850),数据确实应该是"长"格式,`ggplot`比你使用的"宽"格式更自然地处理它. (5认同)
  • 教我在ggplot(aes())上定义x,然后在geom _*()上定义y.太好了! (3认同)

小智 38

我认为您正在寻找的答案是:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不起作用,它给出了一个"添加"不是图形参数`警告然后只是在第一个上打印第二个图. (24认同)
  • @WaldirLeoncio见http://stackoverflow.com/questions/6789055/r-inconsistency-why-add-t-sometimes-works-and-sometimes-not-in-the-plot-funct (7认同)
  • add 参数适用于某些绘图方法,但不适用于 R 中的基本/默认方法 (3认同)
  • 我遇到了同样的错误,““ add”不是图形参数”。我的R是`R版本3.2.3(2015-12-10)`。您可以在这些图之间使用“ par(new = TRUE)”命令。 (2认同)

Spa*_*man 27

使用matplot功能:

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))
Run Code Online (Sandbox Code Playgroud)

如果y1y2在同x一点评估使用它.它可以缩放Y轴以适合更大(y1y2)的任何一个,不像其他一些答案,y2如果它变大y1(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")
Run Code Online (Sandbox Code Playgroud)

我很惊讶这个Q是4岁,没有人提到matplotx/ylim...


iso*_*mes 24

tl; dr:你想使用curve(with 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.(如果你不记得这些是两个重要绘图命令的名称,那就吧.)

这是curve和之间的巨大差异lines.

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

这里有一个小的区别:curve需要调用add=TRUE你正在尝试做的事情,而lines已经假设你正在添加一个现有的情节.

id&sine

这是打电话的结果plot(0:2); curve(sin).


在幕后,退房methods(plot).并检查body( plot.function )[[5]].当你调用plot(sin)R数字时,这sin是一个函数(不是y值)并使用plot.function最终调用的方法curve.curve用于处理功能的工具也是如此.


Hen*_*rik 16

如@redmode所述,您可以使用相同的图形设备绘制两条线ggplot.在该答案中,数据采用"宽"格式.但是,使用ggplot它时通常最方便的是将数据保存在"长"格式的数据框中.然后,通过在aesthetics参数中使用不同的"分组变量" ,该行的属性(如线型或颜色)将根据分组变量而变化,并且将显示相应的图例.

在这种情况下,我们可以使用colouraessthetics,它将线条的颜色与数据集中变量的不同级别相匹配(此处:y1 vs y2).但首先我们需要将数据从宽格式转换为长格式,例如使用reshape2包中的"融化"功能.此处描述了重塑数据的其他方法:将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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


mca*_*ral 15

如果您正在使用基本图形(即非格子/网格图形),则可以使用点/线/多边形函数模拟MATLAB的保持特征,以便在不创建新图的情况下向图中添加其他详细信息.对于多画布布局,您可以使用par(mfg=...)选择要添加内容的图.


Ham*_*005 15

如果你想分割屏幕,你可以这样做:

(例如,下面的2个图)

par(mfrow=c(1,2))

plot(x)

plot(y) 
Run Code Online (Sandbox Code Playgroud)

参考链接


小智 13

你可以使用点作为上图,即.

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

points(x2,y2,col='blue')
Run Code Online (Sandbox Code Playgroud)


cra*_*rry 7

而不是将值保存在数组中,而是将它们存储在矩阵中.默认情况下,整个矩阵将被视为一个数据集.但是,如果向绘图中添加相同数量的修改器,例如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")
Run Code Online (Sandbox Code Playgroud)

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


Sau*_*han 7

使用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))
Run Code Online (Sandbox Code Playgroud)

工作演示的屏幕截图:

在此输入图像描述


epo*_*po3 6

您还可以使用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')
Run Code Online (Sandbox Code Playgroud)

这将创建以下图:

在此处输入图片说明


Mat*_*hez 5

您可以使用plotly包中的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")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 现在,plotly R软件包是100%免费和开源的(MIT许可)。您可以在有或没有积家帐户的情况下使用它。 (2认同)

Ale*_*son 5

习惯用法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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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


Var*_*n K 5

我们还可以使用格子库

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))
Run Code Online (Sandbox Code Playgroud)

对于特定颜色

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"))))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述