在R中绘制多行(数据系列),每行具有唯一的颜色


71

我对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()函数,但是尚不清楚应使用哪个参数来反映每个类别的这种独特颜色?

任何帮助或建议,将不胜感激。


2
您可能想更改col = category,那么您可能会看到每个系列的不同颜色。您能给我们提供示例数据吗?ggplot2可能是一个更简单的选择。
Jd Baba 2013年

Answers:


75

如果您的数据采用这种格式 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,大部分绘制paramters如pch等使用相同matplot()plot()在此处输入图片说明


3
当人们以一种简单的方式在示例本身中创建数据时,而不是从未知的测试数据包中加载数据时,真是太好了!
pglpm

55

如果您想要一个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))

ggplot2_geom_line


32

您有使用基本图形执行此操作的正确通用策略,但是如前所述,您实际上是在告诉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"来抑制原始调用中的所有绘图以设置窗口,并禁止clfor循环内的索引。


(Imo)对于R的初学者来说是一个不错的解决方案:)
Christophe De Troyer 2014年

见我的备选答案低于使用产生相同的输出lapply,而不是for
theforestecologist

17

使用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()

输出值 在此处输入图片说明


8

使用@Arun虚拟数据:)这是一个lattice解决方案:

xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)

在此处输入图片说明


8

我知道,它过去是一则要回答的帖子,但就像我偶然发现相同的帖子一样,其他人也可能会转过来

通过在ggplot函数中添加:color,我可以实现与图中存在的组相关的具有不同颜色的线。

ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID)))    

geom_line() 

多种颜色的线图


8

@joran的答案除了将baseplot函数与for循环一起使用外,还可以将baseplotlapply以下代码一起使用

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显示出的性能比forR中更快/更好(例如,请参见此处;尽管请参见此处)的情况并非如此),但在这种情况下,其性能大致相同:

lapplyfor方法的行数都增加到50000 ,分别花费了我的系统46.346.55几秒钟的时间。

  • 因此,尽管lapply速度稍快,但可以忽略不计。对于更大/更复杂的图形,这种速度差异可能会派上用场,但是老实说,50000行可能是一个相当不错的上限...

因此,“为什么lapply?”的答案是:这只是一种同样有效的替代方法。:)


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)


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:每个组仅包含一个观察值。是否需要调整组的美观度?”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.