0

我想用循环绘制许多类似的图。

我要做的是:

plot(0, 0, type="l", col="white", xlim=range(1,N), ylim=range(0.5, 2.5)) # provide axes, frame, ...
for(col in colors)
{
    X <- generate_X() # vector of random numbers
    lines(1:N, X, type="l", col=col)
}

问题是随机数有时会超出范围range(0.5,2.5),我想延长ylim范围。Atm 我将在ting之前minmax之前进行。plot但是必须有很多,更清洁的方式,我很难在任何地方找到。

我想我错过了一些关于绘图的基本知识,但我找不到解决方案。

谢谢

4

1 回答 1

1

我认为OP的问题有两个快速答案:

  • 在初始化绘图之前计算绘图范围(由 OP 暗示),或
  • 使用“更清洁”的绘图包装功能。

设置:首先我们需要定义 OP 所暗示的变量和函数,然后生成一些数据来处理。

# Initialize our N number of X points and
# colors vector.
N <- 20
colors <- c("yellow", "red", "blue", "green")

# Create function 'generate_X' to perform
# as implied by the OP.
generate_X <- function(.N){
    rnorm(n=.N, mean=0, sd=1)
}

# Generate the entire data frame
# using the 'matrix' function to shape
# the data quickly.
data <- data.frame(
    id=1:N,
    matrix(
        generate_X(N*length(colors)), 
        ncol=length(colors)
        )
    )

上面的代码只是初始化了 OP 示例所需的变量、函数和数据。

方法1:计算绘图范围并初始化绘图。这很容易使用“范围”功能。在我们创建的数据框中,我们的 x 值有一个“id”列,所以我们使用 'data$id' 的范围作为我们的 x。然后,我们找到除第一列 ( data[,-1]) 之外的每一列中所有数据的范围,以找到整个 y 范围。我们使用白色进行初始化,因为我们的背景也是白色的。否则,我们将在左下角和右上角有一个点。我添加 x 和 y 标签只是为了看起来。

plot(
    range(data$id), 
    range(data[,-1]), 
    col="white", 
    xlab="x", 
    ylab="y")

接下来我们只是循环并绘制线条。

for(i in 1:length(colors)){
    lines(data$id, data[, i + 1], type="l", col=colors[i])
}

这与 OP 演示的基本相同,但它稍微适应了接受数据帧作为输入。使用整数计数器(i在这种情况下)而不是颜色列表来引用列要容易得多。

绘图样本


方法 2:有很多情节包装器包,其中一个最受欢迎的是“ggplot2”包,这是有充分理由的。您可以通过将形状数据输入“ggplot”函数来避免很多关于绘图的循环麻烦。从阅读的角度来看,这里的代码更“干净”。

# Load packages for shaping data and plotting.
library(reshape2)
library(ggplot2)

首先,我们需要“reshape2”包,因为我们想在绘图中使用“融化”数据。这只是使“ggplot”代码更干净。然后,我们为绘图加载“ggplot2”包。

对于我们的绘图,我们在没有任何指令的情况下初始化绘图,因此我们可以在几何层中指定它们。如果我们从相同的数据创建多个图层,我们将在基础绘图图层中指定选项,但为此,我们只创建一个带有线条的几何图层。+允许我们添加绘图层。

接下来,我们选择一个几何层(在本例中为“geom_line”)并将数据指定为melt(data, id.vars="id"). 这为“ggplot”函数塑造了我们的数据,以使用最少的代码。我们使用“id”列作为 ID 变量,因为它包含我们的 x 值。成形的数据现在看起来更像这样:

#    id variable        value
# 1   1       X1 -0.280035386
# 2   2       X1 -0.371020958
# 3   3       X1 -0.239889784
# 4   4       X1  0.450357442
# 5   5       X1 -0.801697283
# 6   6       X1 -0.453057841
# 7   7       X1 -0.451321958
# 8   8       X1  0.948124835
# 9   9       X1  2.724205279
# 10 10       X1 -0.725622824
# 11 11       X1  0.475545293
# 12 12       X1  0.533060822
# 13 13       X1 -1.928335572
# 14 14       X1 -0.466790259
# 15 15       X1 -1.606005895
# 16 16       X1  0.005678344
# 17 17       X1 -1.719827853
# 18 18       X1  0.601011314
# 19 19       X1 -2.056315661
# 20 20       X1  1.006169713
# 21  1       X2 -1.591227194
# ...
# 80 20       X4 -1.045224561

你不需要太拘泥于塑形。只需了解“融化”数据与“ggplot”函数配合得更好。我们将融化的数据指定为几何层的数据,然后使用“aes”函数告诉几何层如何处理我们的数据。我们的 x 值在“id”列中,我们的 y 值在“value”列中。下一部分是删除循环的内容:我们根据“变量”列指定要区分的颜色。在我们融化的数据中,“变量”列包含数据最初来自的列的名称,使用它来指定颜色将告诉“ggplot”自动更改每个新“变量”值的颜色。

ggplot() + 
    geom_line(
        data=melt(data, id.vars="id"), 
        aes(
            x=id, 
            y=value, 
            col=variable
            ), 
        lwd=1, 
        alpha=0.7)

我指定了线宽(“lwd”)和 alpha 值,只是为了使图表更具可读性。

ggplot 样本

于 2013-09-23T19:15:56.270 回答