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中执行此操作吗?#1 楼
lines()
或points()
将添加到现有图形中,但不会创建新窗口。所以你需要做plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
评论
为什么在下面的简单示例中不起作用? > plot(sin)> lines(cos)as.double(y)中的错误:无法将类型'builtin'强制转换为类型'double'的向量
–坦白
2013年6月5日18:51
这很容易看到。使用plot(sin),您将传递函数而不是实际数据。 plot()将检测到此情况,然后使用plot.function()来绘制函数(在多个分派中阅读以了解有关此内容的更多信息)。但是,未定义lines.function(),因此lines()不知道如何处理类函数的参数。行只能处理ts类的数据和时间序列对象。
–苏门答腊
13年7月9日在4:17
@Frank这样做:plot(sin); curve(cos,add = TRUE)。
–同构
15年3月14日在14:23
如果x不同,如何使用相同的符号?假设我有一个图的x1和y1,并在同一图中添加了另一个x2和y2的图。 x1和x2的范围相同,但值不同。
– Kavipriya
2015年10月21日在4:35
完全相同:lines(x2,y2,...)代替lines(x,y2,...)
– bnaul
2015年10月21日在20:52
#2 楼
您也可以使用par
并在同一张图上绘制,但轴不同。如下所示:plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )
如果详细阅读了
par
中有关R
的内容,您将能够生成非常有趣的图形。另一本值得一看的书是Paul Murrel的R Graphics。评论
我的R给我一个错误:par(fig(new = TRUE))中的错误:找不到函数“ fig”
–亚历山德罗·贾科普森(Alessandro Jacopson)
2011-6-28在7:51
您的方法是否为两个图保留了正确的比例尺(y轴)?
–亚历山德罗·贾科普森(Alessandro Jacopson)
2012年6月5日下午6:52
@uvts_cvs是的,它将原始图形保留在toto中。
–山姆
2012年9月23日下午13:02
问题在于它将重写几个绘图元素。我将在第二个图中包括xlab =“”,ylab =“”,...和其他一些内容。
–同构
13年11月18日在20:45
#3 楼
构建多层图时,应考虑使用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)
这里
+ operator
用于向基本对象添加额外的层。通过
ggplot
,您可以访问图形对象绘图的每个阶段。说,通常的逐步设置可能如下所示: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
g
生成绘图,并且您可以在每个阶段看到它(嗯,创建后至少一层)。还可以使用创建的对象制作剧情的更多结界。例如,我们可以为轴添加标签: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
看起来像:UPDATE (2013-11-08):
评论中指出,
ggplot
的哲学建议使用长格式数据。您可以参考此答案以查看相应的代码。 。
评论
正如Henrik所建议的那样,数据确实应为“长”格式,ggplot处理的数据比您使用的“宽”格式更自然。
– krlmlr
13年9月26日在21:48
@Henrik:不,首先谢谢您的回答。也许这个答案的作者可以对其进行编辑,使其与ggplot的哲学非常吻合...
– krlmlr
13年9月26日在21:59
教我在ggplot(aes())上定义x,然后在geom _ *()上单独定义y。真好!
–丹
17年7月7日在4:35
#4 楼
我认为您正在寻找的答案是:plot(first thing to plot)
plot(second thing to plot,add=TRUE)
评论
这似乎不起作用,它给出了“添加”不是图形参数警告,然后仅在第一个图上打印第二个图。
– Waldir Leoncio
14年8月26日在18:19
@WaldirLeoncio参见stackoverflow.com/questions/6789055/…
–亚历山德罗·贾科普森(Alessandro Jacopson)
2014年10月7日在18:29
这样做的一个好处是,它似乎使轴限制和标题保持一致。某些以前的方法使R在y轴上绘制两组刻度线,除非您麻烦指定更多选项。不用说,在轴上有两组刻度线可能会引起误解。
–RMurphy
17年2月15日在21:32
add参数适用于某些绘图方法,但不适用于R中的基础/默认方法
– cloudscomputes
17-10-12在6:40
我收到相同的错误“添加”不是图形参数。我的R是R版本3.2.3(2015-12-10)。您可以在这些图之间使用par(new = TRUE)命令。
–quepas
17年11月13日在12:29
#5 楼
使用matplot
函数:matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))
如果在相同的
y1
点上评估y2
和x
,请使用此函数。它缩放Y轴以适合更大的那个(y1
或y2
),这与其他一些答案不同(如果它变得大于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")
我很惊讶Q是4岁,没有人提到
matplot
或x/ylim
... #6 楼
tl; dr:您要使用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)
,这比我要向您展示的要容易--如果您不仅要添加两条曲线,而且要添加很多曲线,则要容易得多。让我一直对绘图感到困惑的是
curve
和lines
之间的区别。 (如果您不记得这些是两个重要的绘图命令的名称,只需唱一下即可。)将绘制一个函数,例如curve
。 lines
绘制带有x和y值的点,例如:curve
。这是一个小小的区别:
curve(sin)
需要使用lines
来调用您要执行的操作,而lines( x=0:10, y=sin(0:10) )
已经假定您在这是调用
curve
的结果。在幕后,查看
add=TRUE
。并检查lines
。当您调用plot(0:2); curve(sin)
时,R会发现methods(plot)
是一个函数(不是y值),并使用body( plot.function )[[5]]
方法,该方法最终调用plot(sin)
。因此,sin
是用于处理功能的工具。#7 楼
如@redmode所述,您可以使用ggplot
在同一图形设备中绘制两条线。在那个答案中,数据是“宽”格式的。但是,使用ggplot
时,通常最方便的是将数据保留在“长”格式的数据帧中。然后,通过在aes
thetics参数中使用不同的“分组变量”,线的属性(例如线型或颜色)将根据分组变量而变化,并出现相应的图例。在这种情况下,我们可以使用
colour
美学技术,该技术将线条的颜色与数据集中变量的不同级别(此处为y1与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()
#8 楼
如果要将图分成两列(彼此相邻的2个图),可以这样操作:par(mfrow=c(1,2))
plot(x)
plot(y)
参考链接
#9 楼
如果您使用的是基础图形(即不是栅格/网格图形),则可以通过使用点/线/多边形函数来模拟MATLAB的保持功能,以在不开始新绘图的情况下向绘图添加其他细节。如果是多图布局,则可以使用par(mfg=...)
选择要添加内容的图。#10 楼
您可以将点用于叠加图,即。plot(x1, y1,col='red')
points(x2,y2,col='blue')
#11 楼
而不是将要绘制的值保留在数组中,而是将它们存储在矩阵中。默认情况下,整个矩阵将被视为一个数据集。但是,如果您向图中添加相同数量的修改器,例如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")
除非您的数据集大小不同,否则此方法应该起作用。
评论
这给出:if(as.factor){:错误不能解释为逻辑
– baouss
19年5月7日在4:42
#12 楼
您可以使用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")
/>
评论
阴暗地看起来很棒;免费吗?
–丹尼斯
2015年6月2日15:45
@denis,有无限的免费公共绘图和付费私人绘图或内部部署选项。请参阅计划页面。
–马特·桑切斯(Mateo Sanchez)
15年6月3日在21:03
现在,plotly R软件包是100%免费和开源的(MIT许可)。您可以在有或没有帐户的情况下使用它。
–卡森
19年1月7日在19:58
#13 楼
例如,可以将成语Matlabplot(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))
灵感来自于婷婷的双线图使用ggplot2可以改变x轴的范围。
#14 楼
您还可以使用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')
这将创建以下绘图:
#15 楼
使用plotly
(从带有主要和次要y轴的plotly
添加解决方案-似乎丢失了):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))
工作演示的屏幕截图:
评论
我编译了代码,但不起作用,首先在%>%中标记了一个错误,然后将其删除,然后在库(plotly)中标记了错误:没有名为“ plotly”的软件包,为什么?
–贝拉特里克斯
19年6月12日在20:07
您是否已按计划安装了软件包?您需要使用install.packages(“ plotly”)命令安装软件包。
– Saurabh Chauhan
19年6月13日在7:42
#16 楼
我们还可以使用晶格库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"))))
评论
检出曲线。使用add = TRUE。有关更具体的ggplot2答案,请参见此问题。