【问题标题】:Plotting multiple curves same graph and same scale绘制多条曲线相同的图形和相同的比例
【发布时间】:2011-10-14 18:09:08
【问题描述】:

这是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 轴刻度。

【问题讨论】:

  • 我不确定你想要什么。您想要的图形会有所帮助...
  • 只是为了添加到 Manoel 的评论中,第二组 y 值超出了第一组的范围。您希望它们被绘制在哪里?
  • @Manoel:这就是我真正想要的......
  • @joran: 是的,对不起,但即使将其更改为 y2 &lt;- c(101, 102, 103, 104, 105) 也不起作用...

标签: r plot


【解决方案1】:

(典型的方法是只使用一次plot 设置限制,可能包括所有系列组合的范围,然后使用pointslines 添加单独的系列。)要将plotpar(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)

【讨论】:

  • 第二组y值不是应该是1:5吗?
  • 是的,这不起作用。可以看到这些点并没有以相同的 y 轴刻度表示,否则 2 会大于 100... :)
  • 现在我明白了。我同时绘制每个点,然后画线。那很好。谢谢!
  • 还有matplot。我会添加一个注释。
【解决方案2】:

我的解决方案是使用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分隔点。

生成的图是

【讨论】:

    【解决方案3】:

    pointslines 会派上用场

    • y2 稍后生成,或者
    • 新数据没有相同的x,但仍应进入相同的坐标系。

    由于您的ys 共享相同的x,您也可以使用matplot

    matplot (x, cbind (y1, y2), pch = 19)
    

    (没有pch matplopt 将绘制y 矩阵的列号而不是点)。

    【讨论】:

    • 如何分别用 y1 和 y2 注释黑点和红点?
    • @dacongy: pch 接受 y 矩阵的每一列的单字符符号(如“A”和“B”或“1”和“2”)。如果你真的需要更长的文本,AFAIK 你需要为每一列使用text(或编写一个 mattext 函数 ;-))
    【解决方案4】:

    鉴于您的示例代码,我认为@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 不是您想要的,您希望使用 points添加到绘图中。所以我机器上的上述代码产生了这个:

    但是 DWin 关于使用ylim 的主要观点是正确的。

    【讨论】:

    • 点给你。通过在两者上使用相同的 ylim 修复了我的 y 问题。回想起来可能应该使用积分。
    • 您不需要c 在范围内。 range(y1,y2) 就足够了。
    【解决方案5】:

    我不确定你想要什么,但我会使用 lattice。

    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)
    

    【讨论】:

    • xyplot(y~x, groups=z, df)。并且无需创建新的data.framexyplot(y1+y2~x)
    • 我知道,但我没用过!也许我应该试一试。为指针 +1。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2019-04-17
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多