我想逐步构建一个包含几个不同长度的数据系列的图。我的目标是能够控制每个数据系列的外观, 给他们自定义名称 并有适当的传说。我的数据系列有不同的长度,所以 我不能把它们放在一个数据帧中。 在下面的代码中我期望4行:最短的将是红色,下一个将分别是蓝色,绿色和黑色
library(ggplot2)
set.seed(12345)
plt <- ggplot()
colors <- c('red', 'blue', 'green', 'black')
for(i in seq(length(colors))) {
x <- seq(1, 2*i)
y <- x * i + rnorm(length(x))
df <- data.frame(x=x, y=y)
plt <- plt + geom_point(aes(x, y), data=df, color=colors[i]) +
geom_line(aes(x, y), data=df, color=colors[i])
}
print(plt)
这就是我得到的。
如何为线条命名并显示图例? 有没有更好的方法来实现我的目标?
答案 0 :(得分:2)
执行此操作的方法是以长格式创建单个数据框:
像这样:
library(ggplot2)
set.seed(12345)
colors <- c('red', 'blue', 'green', 'black')
dat <- lapply(seq_along(colors), function(i){
x <- seq(1, 2*i)
data.frame(
series = colors[i],
x = x,
y = x * i + rnorm(length(x))
)}
)
dat <- do.call(rbind, dat)
现在绘制
ggplot(dat, aes(x, y, color=series)) + geom_line()
答案 1 :(得分:2)
在构造数据后,您不必每次都使用for-loop
绘图,因为它们的长度不相等。这就是为什么ggplot2
太棒了!您可以为每个数据集创建group
。并且您可以使用与图例中显示的相同group
将该行命名为您想要的任何内容(当然,如果您愿意,您也可以直接在图例中更改它)。这就是我的想法:
set.seed(12345)
require(ggplot2)
require(plyr)
# to group your data. change the letters to whatever you want to appear as legend
line_names <- letters[1:4]
# Use plyr to create your x and y for each i and add the group.
dat <- ldply(1:length(colors), function(i) {
x <- seq(1, 2*i)
y <- x * i + rnorm(length(x))
data.frame(x=x, y=y, grp=line_names[i])
})
# just plot here.
ggplot(data = dat, aes(x=x, y=y)) + geom_line(aes(colour=grp)) + geom_point()