78

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

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

4

10 回答 10

86

如果您的数据是宽格式 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大多数绘图参数(例如pchetc.)与使用matplot()as相同plot()在此处输入图像描述

于 2013-02-13T18:33:01.000 回答
58

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

于 2013-02-13T18:11:43.783 回答
37

您有使用基本图形执行此操作的正确一般策略,但正如所指出的那样,您实际上是在告诉 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 循环内的索引。

于 2013-02-13T18:17:15.103 回答
19

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

输出 在此处输入图像描述

于 2017-03-07T10:38:08.443 回答
11

我知道,它是一个旧帖子,但就像我在搜索同一个帖子时遇到的一样,其他人也可能会转到这里

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

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

geom_line() 

多种颜色的折线图

于 2016-08-19T22:28:03.917 回答
8

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

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

在此处输入图像描述

于 2013-02-13T19:30:55.070 回答
8

除了@joran's answer using base plotfunction with a forloop,您还可以使用 base plotwithlapply

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已经证明比for在 R 中执行得更快/更好(例如,请参见此处;尽管请参见此处以获取不是的实例),但在这种情况下,它的执行大致相同:

lapply将和方法的行数增加到 50000分别for花费了我的系统46.346.55秒。

  • 所以,虽然lapply只是稍微快了一点,但可以忽略不计。这种速度差异可能会在更大/更复杂的图形中派上用场,但老实说,50000 行可能是一个相当不错的上限......

所以“为什么lapply?”的答案是:它只是一种同样有效的替代方法。:)

于 2018-05-31T16:51:12.033 回答
3

这是使用添加行的另一种方法plot()

一、使用函数par(new=T)

选项:

http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html

要为它们着色不同,您将需要col().

为避免多余的轴描述,请使用xaxt="n"yaxt="n" 用于第二个和更多图。

于 2013-11-17T23:05:57.080 回答
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)
于 2015-04-13T15:32:13.127 回答
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:每个组仅包含一个观察值。您需要调整组审美吗?”

于 2020-02-05T13:52:53.500 回答