我想在同一图中绘制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中做到这一点吗?
我想在同一图中绘制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中做到这一点吗?
Answers:
lines()
或points()
将添加到现有图形中,但不会创建新窗口。所以你需要做
plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
plot(sin); curve(cos, add=TRUE)
。
lines(x2,y2,...)
而不是lines(x,y2,...)
您还可以par
在相同的图形上但在不同的轴上使用和绘制。如下所示:
plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )
如果您详细阅读有关par
中的内容R
,您将能够生成非常有趣的图表。另一本值得一看的书是Paul Murrel的R Graphics。
xlab="", ylab="", ...
在第二个中包括其他一些人plot
。
在构建多层地块时,应考虑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
看起来像:
更新(2013-11-08):
正如评论中指出的那样,ggplot
的哲学建议使用长格式的数据。您可以参考此答案以查看相应的代码。
ggplot
哲学...
我认为您正在寻找的答案是:
plot(first thing to plot)
plot(second thing to plot,add=TRUE)
"add" is not a graphical parameter
警告,然后在第一个图上打印第二个图。
"add" is not a graphical parameter
。我的R是R version 3.2.3 (2015-12-10)
。您可以par(new=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
(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
...
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
。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
参数中线的属性(例如线型或颜色)将根据分组变量而变化,并出现相应的图例。
在这种情况下,我们可以使用colour
美学方法,将线条的颜色与数据集中变量的不同级别(此处为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()
例如,可以使用以下方式plot(x1,y1,x2,y2)
在R中翻译成语Matlab 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轴不同范围内的双线图的启发。
您可以使用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")
使用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))
工作演示的屏幕截图:
Error in library(plotly) : there is no package called ‘plotly’
为什么?
plotly
吗?您需要使用install.packages("plotly")
命令安装软件包。
我们也可以使用晶格库
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"))))
?curve
。使用add=TRUE
。