在 R 中绘制多条线(数据系列),每条线都具有独特的颜色
Posted
技术标签:
【中文标题】在 R 中绘制多条线(数据系列),每条线都具有独特的颜色【英文标题】:Plot multiple lines (data series) each with unique color in R 【发布时间】:2013-01-29 09:13:26 【问题描述】:我对 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()
函数,但是不清楚应该使用哪个参数来反映每个类别的这种独特颜色?
任何帮助或建议将不胜感激。
【问题讨论】:
您可能想要更改 col=category,然后您可能会看到每个系列的不同颜色。你能给我们提供样本数据吗? ggplot2 可能是一个更简单的选择。 【参考方案1】:如果您的数据在 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()
是相同的。
【讨论】:
以一种简单的方式在示例本身中创建数据,而不是从一些未知的测试数据包中加载数据,真是太好了!【参考方案2】:如果您想要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))
【讨论】:
【参考方案3】:您有使用基本图形执行此操作的正确一般策略,但正如所指出的,您实际上是在告诉 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
的索引。
【讨论】:
(Imo) 是 R 初学者的绝佳解决方案 :) 在下面查看我的alternative answer,使用lapply
而不是for
产生相同的输出
这个答案可以通过包含像the top-voted answer 这样的图例来更完整。【参考方案4】:
使用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()
输出
【讨论】:
如何给每一行随机的颜色?如果我在 for 循环中添加行?【参考方案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】:使用@Arun 虚拟数据:) 这里是lattice
解决方案:
xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)
【讨论】:
【参考方案7】:除了@joran 的answer 使用带有for
循环的基本plot
函数之外,您还可以使用带有lapply
的基本plot
:
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
?”的答案是:它只是一种同样有效的替代方法。 :)
【讨论】:
【参考方案8】:这是一个示例代码,如果感兴趣的话,还包括一个图例。
# 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)
【讨论】:
【参考方案9】:这是另一种使用plot()
添加行的方法:
首先,使用函数par(new=T)
选项:
http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html
要给它们上色,你需要col()
。
为避免多余的轴描述,请使用 xaxt="n"
和 yaxt="n"
用于第二个和更多的情节。
【讨论】:
【参考方案10】:如果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:每个组只包含一个观察值。是否需要调整 群体审美?”
【讨论】:
以上是关于在 R 中绘制多条线(数据系列),每条线都具有独特的颜色的主要内容,如果未能解决你的问题,请参考以下文章