这是this question的后续行动。
我想在同一个图表上绘制多条曲线,但我的新曲线与第一条曲线生成的y轴刻度相同。
请注意以下示例:
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
# first plot
plot(x, y1)
# second plot
par(new = TRUE)
plot(x, y2, axes = FALSE, xlab = "", ylab = "")
这实际上是在图表的相同坐标上绘制两组值(因为我隐藏了将使用第二个图创建的新y轴)。
我的问题是如何在绘制第二张图时保持相同的y轴刻度。
答案 0 :(得分:34)
(典型的方法是使用plot
一次设置限制,可能包括所有系列组合的范围,然后使用points
和lines
来添加单独的系列。)要与plot
多次使用par(new=TRUE)
,您需要确保您的第一个地图有一个适当的ylim
来接受所有系列(在另一种情况下,你可能还需要对xlim使用相同的策略:
# first plot
plot(x, y1, ylim=range(c(y1,y2)))
# second plot EDIT: needs to have same ylim
par(new = TRUE)
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "")
下一个代码将更紧凑地执行任务,默认情况下,您将数字作为点,但第二个代码为您提供典型的R类型“点”:
matplot(x, cbind(y1,y2))
matplot(x, cbind(y1,y2), pch=1)
答案 1 :(得分:6)
points
或lines
便利
y2
稍后生成,或x
,但仍应进入相同的坐标系。当您的y
分享同一x
时,您也可以使用matplot
:
matplot (x, cbind (y1, y2), pch = 19)
(没有pch
matplopt
会绘制y
矩阵的列号而不是点数。
答案 2 :(得分:5)
你不是很清楚你想要什么,因为我认为@DWin在技术上是正确的,给出了你的示例代码。我认为你真正想要的是:
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
# first plot
plot(x, y1,ylim = range(c(y1,y2)))
# Add points
points(x, y2)
DWin的解决方案是在隐含的假设(基于您的示例代码)下运行,您希望在原始比例上绘制第二组重叠。这就是为什么他的图像看起来像是在1,101等点上绘制的。再次调用plot
不是你想要的,你希望使用{{添加到图中1}}。所以我机器上面的代码产生了这个:
但是DWin关于使用points
的要点是正确的。
答案 3 :(得分:3)
我的解决方案是使用ggplot2
。它会自动处理这些类型的事情。最重要的是妥善安排数据。
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5)))
然后使用ggplot2
绘制
library(ggplot2)
ggplot(df, aes(x=x, y=y, color=class)) + geom_point()
这就是说df
中的数据,并将点数分隔class
。
生成的图是
答案 4 :(得分:1)
我不确定你想要什么,但我会使用格子。
x = rep(x,2)
y = c(y1,y2)
fac.data = as.factor(rep(1:2,each=5))
df = data.frame(x=x,y=y,z=fac.data)
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2)
然后,只绘制
xyplot(y ~x|z, df)
# or maybe
xyplot(x ~y|z, df)