我的矩阵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。
答案 0 :(得分:2)
col
选项,虽然能够进行矢量输入,但只有有效控制点颜色而不是线颜色,因此type = "p"
有效但pch = "l"
无效。对于pch = "b"
,只有点会有正确的颜色。
如果您想要使用不同颜色的多行,则必须使用单独的plot
或lines
调用来绘制它们。更好的方法是重塑数据,然后使用matplot
。它需要一个矩阵,并通过for
循环逐个绘制其列。
由于您已经有了重塑数据的功能,因此您有正确的方法。
plot
和lines
折旧col
中用于行显示的向量值的原因是他们不知道此向量是否具有合理的非随机模式。只使用col[1]
,他们会做一些安全的事情。我将通过两个步骤详细说明这一点。
首先,请考虑此示例,以便在plot
时col[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")
mat1[, 3]
以1开头,因此线条颜色为黑色; mat2[,3]
以2开头,因此线条颜色为红色。
现在是时候说plot
和lines
为什么在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;最安全的假设plot
和lines
可以采用的是col
向量完全随机。因此,它只会保留col[1]
以生成单色图。仅在type = "p"
。
注意,同样的逻辑也适用于lwd
和lty
。与行显示相关联的任何参数将仅采用第一个向量元素。正如我之前所说,如果你想绘制不同风格的几行,请逐一进行。
答案 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])