我认为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 值,只是为了使图表更具可读性。