矢量规范到" col"," lwd"和" lty"绘制线条时不工作?

时间:2016-09-06 08:12:27

标签: r plot colors

我的矩阵dsts有3列;第三是一个因素。我希望我的线性图用因子着色,但是这个命令不起作用:

plot(dsts[ ,'x'],dsts[,'dist'],col=dsts[,'i'],type='l')

plot(dsts[ ,'x'],dsts[,'dist'],col=dsts[,'i'],type='n')
lines(dsts[ ,'x'],dsts[,'dist'],col=dsts[,'i']) 

也不起作用!!!

我想避免使用接受矩阵的matplot。

2 个答案:

答案 0 :(得分:2)

col选项,虽然能够进行矢量输入,但只有有效控制点颜色而不是线颜色,因此type = "p"有效但pch = "l"无效。对于pch = "b",只有点会有正确的颜色。

如果您想要使用不同颜色的多行,则必须使用单独的plotlines调用来绘制它们。更好的方法是重塑数据,然后使用matplot。它需要一个矩阵,并通过for循环逐个绘制其列。

由于您已经有了重塑数据的功能,因此您有正确的方法。

plotlines折旧col中用于行显示的向量值的原因是他们不知道此向量是否具有合理的非随机模式。只使用col[1],他们会做一些安全的事情。我将通过两个步骤详细说明这一点。

首先,请考虑此示例,以便在plotcol[1]始终使用type = "l"

set.seed(0); mat1 <- round(cbind(rnorm(9),rnorm(9),rep(1:3, each = 3)), 1)
#      [,1] [,2] [,3]
# [1,]  1.3  2.4    1
# [2,] -0.3  0.8    1
# [3,]  1.3 -0.8    1
# [4,]  1.3 -1.1    2
# [5,]  0.4 -0.3    2
# [6,] -1.5 -0.3    2
# [7,] -0.9 -0.4    3
# [8,] -0.3  0.3    3
# [9,]  0.0 -0.9    3

然后我们重新排序mat1

的行
mat2 <- mat1[c(4:9,1:3), ]
#      [,1] [,2] [,3]
# [1,]  1.3 -1.1    2
# [2,]  0.4 -0.3    2
# [3,] -1.5 -0.3    2
# [4,] -0.9 -0.4    3
# [5,] -0.3  0.3    3
# [6,]  0.0 -0.9    3
# [7,]  1.3  2.4    1
# [8,] -0.3  0.8    1
# [9,]  1.3 -0.8    1

我们使用col的第3列,现在比较:

par(mfrow = c(1,2))
plot(mat1[,1], mat1[,2], col = mat1[,3], type = "l")
plot(mat2[,1], mat2[,2], col = mat2[,3], type = "l")

enter image description here

mat1[, 3]以1开头,因此线条颜色为黑色; mat2[,3]以2开头,因此线条颜色为红色。

现在是时候说plotlines为什么在col时折旧向量type = "l"。考虑mat1的随机行重排:

set.seed(0); mat3 <- mat1[sample(9), ]
#      [,1] [,2] [,3]
# [1,]  0.0 -0.9    3
# [2,]  1.3 -0.8    1
# [3,] -0.3  0.3    3
# [4,]  1.3 -1.1    2
# [5,]  0.4 -0.3    2
# [6,]  1.3  2.4    1
# [7,] -0.9 -0.4    3
# [8,] -0.3  0.8    1
# [9,] -1.5 -0.3    2

plot(..., type = "l")会逐一排列积分。请注意,如果此路径上的数据点具有相同的颜色规范,则只能绘制单一颜色的线条。现在,第3列是完全随机的:没有办法按照这种颜色规范排列点。

最好的&amp;最安全的假设plotlines可以采用的是col向量完全随机。因此,它只会保留col[1]以生成单色图。仅在type = "p"

时才会使用完整向量

注意,同样的逻辑也适用于lwdlty。与行显示相关联的任何参数将仅采用第一个向量元素。正如我之前所说,如果你想绘制不同风格的几行,请逐一进行。

答案 1 :(得分:0)

除了@Zheyuan Li对手头的问题有价值的见解我写了一个简单的函数来克服这个问题:

plot_line_color <- function(x,y,fact,lwd=2,...) 
{
  plot(x,y,type='n')
  xy <- cbind(x,y)
  invisible(
   lapply(1:length(unique(fact)), function(j) { 
     xy2 <- subset(xy,fact==j)
    lines(xy2[ ,1],xy2[,2],col=j,lwd=lwd,...)
    })
  )
}

一个简单的模拟:

k <- 1:5
x <- seq(0,10,length.out =  100)
dsts <- lapply(1:length(k), function(i) cbind(x=x, distri=dchisq(x,k[i]),fact=i) )
dsts <- do.call(rbind,dsts)

plot_line_color(x=dsts[,1],y=dsts[,2],fact=dsts[,3])