在同一个画布上绘制很多图(干净的方式)

时间:2013-09-23 17:22:51

标签: r plot

我想用循环绘制一些类似的图。

我的工作是:

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我将在min之前使用maxplot进行此操作。但是必须有更多,更清洁的方式,我无法在任何地方找到它。

我认为我遗漏了一些关于绘图的基本知识,但我无法找到解决方案。

由于

1 个答案:

答案 0 :(得分: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 :计算绘图范围并初始化绘图。使用'range'功能非常简单。在我们创建的数据框中,我们的x值有一个“id”列,因此我们对x使用'data $ id'的范围。然后,我们找到每列上的所有数据的范围,除了第一列(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)而不是颜色列表来引用列要容易得多。

plot sample


方法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 sample