R:以更简单的方式绘制线条

时间:2018-03-13 21:06:28

标签: r plot

我正在进行一些线路绘图。我有这个矩阵:

  [,1] [,2] [,3]
1  0.1  0.2  0.3
2  0.5  1.0  1.5
3  1.0  1.5  2.0
4  1.5  2.0  2.5

我计算每个矩阵列的 L1范数。因此,每列的标准将是[1] 3.1 4.7 6.3 L1范数将是x轴。每个矩阵行都是y轴。

因此,对于 x [1] 3.1 4.7 6.3 y 0.1 0.2 0.3,我会绘制一行。

对于 x [1] 3.1 4.7 6.3 y 0.5 1.0 1.5我会绘制另一条直线,依此类推。

以下是代码:

mat=matrix(c(0.1,0.5, 1, 1.5, 0.2, 1, 1.5 ,2,0.3, 1.5, 2, 2.5), nrow=4, ncol=3)
rownames(mat) <- seq_len(nrow(mat))
norm1=as.vector(rep(0,3))
for (i in 1:3) {
  norm1[i]=norm(as.matrix(mat[,i]))   
}
y1=c(0.1, 0.2, 0.3)
y2=c(0.5,1.0,1.5)
y3=c(1.0,1.5,2)
y4=c(1.5,2,2.5)
plot(norm1,y1, type = "l", xlim=c(3,7), ylim=c(0,3)) 
lines(norm1,y2)
lines(norm1,y3)
lines(norm1,y4) 

还有其他方法可以让我的绘图更简单,更短吗?如果我有一个矩阵100x20,我必须为每行写y1=c(0.1, 0.2, 0.3)并添加到许多lines(norm1,y4)

这是情节: enter image description here

2 个答案:

答案 0 :(得分:1)

不确定

# automated lims here, you can easily override
plot(NA, xlim=range(norm1), ylim=range(mat))
for (r in seq_len(nrow(mat))) lines(norm1, mat[r,])

答案 1 :(得分:1)

以下是tidyverse解决方案:

L1 <- function(x) sum(abs(x));
bind_cols(
    as.data.frame(mat) %>%
        summarise_all(funs(L1(.))) %>%
        t() %>%
        as.data.frame() %>%
        rename(x = V1),
    t(mat) %>%
        as.data.frame() %>%
        rename_all(funs(gsub("V", "", .)))) %>%
    gather(row, y, 2:5) %>%
    ggplot(aes(x, y, colour = row)) + geom_line();

enter image description here