如何向R图添加颜色匹配图例

ozxc1zmp  于 2023-03-15  发布在  其他
关注(0)|答案(6)|浏览(176)

我使用matplot在图上绘制了几条线:

matplot(cumsum(as.data.frame(daily.pnl)),type="l")

这给了我每一行的默认颜色-这很好,
但我现在想添加一个图例,反映那些相同的颜色-我该如何实现呢?
请注意-我试图不指定颜色的matplot摆在首位。

legend(0,0,legend=spot.names,lty=1)

给我同样的颜色。

0g0grzrc

0g0grzrc1#

matplot的默认颜色参数是data.frame的列号序列,因此可以添加如下图例:

nn <- ncol(daily.pnl)
legend("top", colnames(daily.pnl),col=seq_len(nn),cex=0.8,fill=seq_len(nn))

cars数据集为例,这里是添加图例的完整代码。最好使用layout以一种漂亮的方式添加图例。

daily.pnl <- cars
nn <- ncol(daily.pnl)
layout(matrix(c(1,2),nrow=1), width=c(4,1)) 
par(mar=c(5,4,4,0)) #No margin on the right side
matplot(cumsum(as.data.frame(daily.pnl)),type="l")
par(mar=c(5,0,4,2)) #No margin on the left side
plot(c(0,1),type="n", axes=F, xlab="", ylab="")
legend("center", colnames(daily.pnl),col=seq_len(nn),cex=0.8,fill=seq_len(nn))

bmvo0sr5

bmvo0sr52#

我已经尝试使用虹膜数据集重现您正在寻找的内容。我用以下表达式得到了图:

matplot(cumsum(iris[,1:4]), type = "l")

然后,要添加图例,可以指定默认线颜色和类型,即数字1:4,如下所示:

legend(0, 800, legend = colnames(iris)[1:4], col = 1:4, lty = 1:4)

现在图例和绘图中的坐标都相同了。请注意,您可能需要相应地更改图例的坐标。

ac1kyiln

ac1kyiln3#

我喜欢“agstudy”有一个好的传奇的把戏。
为了便于比较,我以@agstudy为例,用ggplot2绘制了它:

  • 第一步是“融化”数据集
require(reshape2)
df <- data.frame(x=1:nrow(cars), cumsum(data.frame(cars)))
df.melted <- melt(df, id="x")
  • 与使用matplot的解决方案相比,第二步看起来相当简单
require(ggplot2)
qplot(x=x, y=value, color=variable, data=df.melted, geom="line")

a0zr77ik

a0zr77ik4#

有趣的是,@agstudy解决方案确实有效,但仅适用于n ≤ 6
这里我们有一个8列的矩阵。前6个标签的颜色是正确的。第7个和第8个是错误的。图中的颜色从头开始(黑色、红色...),而标签中的颜色是连续的(黄色、灰色...)
我还没有弄明白为什么会这样,我可能会用我的发现来更新这篇文章。

matplot(x = lambda, y = t(ridge$coef), type = "l", main="Ridge regression", xlab="λ", ylab="Coefficient-value", log = "x")
nr = nrow(ridge$coef)
legend("topright", rownames(ridge$coef), col=seq_len(nr), cex=0.8, lty=seq_len(nr), lwd=2)

bq3bfh9z

bq3bfh9z5#

刚刚发现matplot使用线型1:5和颜色1:6来建立线的外观。如果要创建图例,请尝试以下方法:

## Plot multiple columns of the data frame 'GW' with matplot
cstart = 10           # from column 
cend = cstart + 20    # to column 
nr <- cstart:cend
ltyp <- rep(1:5, times=length(nr)/5, each=1) # the line types matplot uses
cols <- rep(1:6, times=length(nr)/6, each=1) # the cols matplot uses 

matplot(x,GW[,nr],type='l')
legend("bottomright", as.character(nr), col=cols, cex=0.8, lty=ltyp, ncol=3)
yhqotfr8

yhqotfr86#

吉姆的answer非常棒,但我们可以通过回收利用来降低成本。

op <- par(mfrow=c(1, 2))   

matplot(M, type='l')  ## w/o explicit specification of colors or lines

matplot(M, type='l', lty=1:5, col=1:6)  ## w/ specification to proof equivalence
legend('topleft', lty=1:5, col=1:6, some_labels)  ## using in legend

par(op)

这样,我们可以得到5*6 = 30条很好区分的专业外观线。

  • 数据:*
set.seed(42)
M <- replicate(10, sort(rnorm(100) + rexp(100)))
some_labels <- sprintf('<label %02d>', seq_len(ncol(M)))

相关问题