我是R的新手,我有以下疑问:
我试图在R中生成一个有多行(数据系列)的图。这些行中的每一行都是一个类别,我希望它具有独特的颜色。
目前我的代码是以这种方式设置的:
首先,我正在创建一个空图:
plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency')
然后对于我的每个类别,我正在使用“for”循环在这个空图中绘制线条,如下所示:
for (category in categories){
lines(data.frame.for.this.category, type='o', col=sample(rainbow(10)), lwd=2)
}
这里有8个类别,因此图中有8行。正如您所看到的,我尝试从rainbows()函数中采样颜色以生成每行的颜色。
然而,当生成绘图时,我发现有多条线具有相同的颜色。例如,这8行中的3行具有绿色。
如何让这8条线中的每一条都有独特的颜色?
另外,我如何在情节的传说中反映这种独特性?我试图查找legend()
函数,但不清楚我应该使用哪个参数来反映每个类别的这种独特颜色?
非常感谢任何帮助或建议。
答案 0 :(得分:63)
如果您的数据位于wide format matplot
,则会为此做出并经常被遗忘:
dat <- matrix(runif(40,1,20),ncol=4) # make data
matplot(dat, type = c("b"),pch=1,col = 1:4) #plot
legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend
对于那些不熟悉ggplot
之类的人来说,使用pch
作为matplot()
等plot()
等大多数绘图参数都是相同的,也会有额外的好处。
答案 1 :(得分:46)
如果您想要ggplot2
解决方案,可以执行此操作,如果您可以将数据整形为此格式(请参阅下面的示例)
# dummy data
set.seed(45)
df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45),
variable=rep(paste0("category", 1:9), each=5))
# plot
ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable))
答案 2 :(得分:26)
你有使用基本图形的正确的一般策略,但正如所指出的那样,你实际上是在告诉R为每一行从一组10中挑选一个随机颜色。鉴于此,您偶尔会得到两条颜色相同的线并不奇怪。以下是使用基本图形的示例:
plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")
cl <- rainbow(5)
for (i in 1:5){
lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')
}
请注意使用type = "n"
来抑制原始调用中设置窗口的所有绘图,以及for循环内cl
的索引。
答案 3 :(得分:10)
使用lines()
函数
# Create the data for the chart.
v <- c(7,12,28,3,41)
t <- c(14,7,6,19,3)
# Give the chart file a name.
png(file = "line_chart_2_lines.jpg")
# Plot the bar chart.
plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall",
main = "Rain fall chart")
lines(t, type = "o", col = "blue")
# Save the file.
dev.off()
答案 4 :(得分:8)
使用@Arun虚拟数据:)这里有一个lattice
解决方案:
xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)
答案 5 :(得分:5)
我知道,它的旧帖子要回答,但就像我遇到同一个帖子一样,其他人也可能会转到这里
通过在ggplot函数中添加:color,我可以实现与绘图中存在的组相关的不同颜色的线条。
ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID)))
和
geom_line()
答案 6 :(得分:4)
除了使用带有plot
循环的基本for
函数的@joran的answer之外,您还可以使用plot
基lapply
强>:
plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")
cl <- rainbow(5)
invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')))
invisible
函数仅用于防止lapply
在控制台中生成列表输出(因为我们想要的只是函数提供的递归,而不是列表)。如您所见,它产生与使用for
循环方法完全相同的结果。
那么为什么要使用lapply
?
虽然lapply
的效果比R中的for
更快/更好(例如,请参见here;尽管请参阅here了一个实例,但不是这样)在这种情况下,它的表现大致相同:
将lapply
和for
方法的行数增加到50000分别占用了我的系统46.3
和46.55
秒。
lapply
只是稍快一些,但却可以忽略不计。这种速度差异可能会在更大/更复杂的图形中派上用场,但说实话,50000线可能是一个相当不错的上限...... 所以答案为“为什么lapply
?”:它只是一种同样有效的替代方法。 :)
答案 7 :(得分:3)
以下是一个示例代码,如果感兴趣,则包含图例。
# First create an empty plot.
plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1),
xlab = "log transformed coverage", ylab = "frequency")
# Create a list of 22 colors to use for the lines.
cl <- rainbow(22)
# Now fill plot with the log transformed coverage data from the
# files one by one.
for(i in 1:length(data)) {
lines(density(log(data[[i]]$coverage)), col = cl[i])
plotcol[i] <- cl[i]
}
legend("topright", legend = c(list.files()), col = plotcol, lwd = 1,
cex = 0.5)
答案 8 :(得分:2)
以下是使用plot()
添加行的另一种方式:
首先,使用函数par(new=T)
选项:
http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html
要对它们进行不同的着色,您需要col()
。
要避免多余的轴描述,请使用xaxt="n"
和yaxt="n"
对于第二个和更多的情节。
答案 9 :(得分:0)
如果x轴是因子/离散变量,并且希望保留变量的顺序(对应于不同组的不同值)以可视化组效果。以下代码将执行:
library(ggplot2)
set.seed(45)
# dummy data
df <- data.frame(x=rep(letters[1:5], 9), val=sample(1:100, 45),
variable=rep(paste0("category", 1:9), each=5))
# This ensures that x-axis (which is a factor variable) will be ordered appropriately
df$x <- ordered(df$x, levels=letters[1:5])
ggplot(data = df, aes(x=x, y=val, group=variable, color=variable)) + geom_line() + geom_point() + ggtitle("Multiple lines with unique color")
还要注意:添加group = variable删除警告信息:“ geom_path:每个组仅包含一个观察值。是否需要调整 群体审美?”