如何将颜色匹配的图例添加到 R matplot
How to add colour matched legend to a R matplot
我使用 matplot 在图表上画了几条线:
matplot(cumsum(as.data.frame(daily.pnl)),type="l")
这为我提供了每行的默认颜色 - 这很好,
但我现在想添加一个反映这些相同颜色的图例 - 我该如何实现?
请注意 - 我试图不首先指定 matplot 的颜色。
legend(0,0,legend=spot.names,lty=1)
给我所有相同的颜色。
matplot 的默认颜色参数是 data.frame 列的 nbr 上的序列。所以你可以像这样添加图例:
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))
我已尝试使用 iris 数据集重现您正在寻找的内容。我得到了以下表达式的情节:
matplot(cumsum(iris[,1:4]), type = "l")
然后,要添加图例,您可以指定默认线条颜色和类型,即数字 1:4,如下所示:
legend(0, 800, legend = colnames(iris)[1:4], col = 1:4, lty = 1:4)
现在你在图例和情节中有了同样的东西。请注意,您可能需要相应地更改图例的坐标。
我喜欢@agstudy 的技巧来制作一个漂亮的图例。
为了比较,我拿了@agstudy 的例子并用 ggplot2
:
绘制了它
第一步是"melt" data-set
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")
有趣的是@agstudy 解决方案可以解决问题,但仅适用于 n ≤ 6
这里我们有一个 8 列的矩阵。前 6 个标签的颜色是正确的。
第 7 和第 8 条是错误的。图中的颜色从头开始 (black, red ...) ,而在标签中它继续 (yellow, grey, ...)
还没搞明白为什么会这样。我可能会根据我的发现更新此 post。
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)
刚刚发现 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)
我使用 matplot 在图表上画了几条线:
matplot(cumsum(as.data.frame(daily.pnl)),type="l")
这为我提供了每行的默认颜色 - 这很好,
但我现在想添加一个反映这些相同颜色的图例 - 我该如何实现?
请注意 - 我试图不首先指定 matplot 的颜色。
legend(0,0,legend=spot.names,lty=1)
给我所有相同的颜色。
matplot 的默认颜色参数是 data.frame 列的 nbr 上的序列。所以你可以像这样添加图例:
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))
我已尝试使用 iris 数据集重现您正在寻找的内容。我得到了以下表达式的情节:
matplot(cumsum(iris[,1:4]), type = "l")
然后,要添加图例,您可以指定默认线条颜色和类型,即数字 1:4,如下所示:
legend(0, 800, legend = colnames(iris)[1:4], col = 1:4, lty = 1:4)
现在你在图例和情节中有了同样的东西。请注意,您可能需要相应地更改图例的坐标。
我喜欢@agstudy 的技巧来制作一个漂亮的图例。
为了比较,我拿了@agstudy 的例子并用 ggplot2
:
第一步是"melt" data-set
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")
有趣的是@agstudy 解决方案可以解决问题,但仅适用于 n ≤ 6
这里我们有一个 8 列的矩阵。前 6 个标签的颜色是正确的。 第 7 和第 8 条是错误的。图中的颜色从头开始 (black, red ...) ,而在标签中它继续 (yellow, grey, ...)
还没搞明白为什么会这样。我可能会根据我的发现更新此 post。
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)
刚刚发现 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)