我想用循环绘制一些类似的图。
我的工作是:
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
之前使用max
和plot
进行此操作。但是必须有更多,更清洁的方式,我无法在任何地方找到它。
我认为我遗漏了一些关于绘图的基本知识,但我无法找到解决方案。
由于
答案 0 :(得分:1)
我认为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
)而不是颜色列表来引用列要容易得多。
方法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值,只是为了让图表更具可读性。