15

我通常使用 ggplot2,但在这种情况下,我使用常规image()函数来绘制大型数据集的热图。我可以将所有标签标记为红色,但我想根据我生成的颜色定义向量用不同颜色的文本标记 y 轴:

grid = structure(c(1:12),.Dim = c(4,3))
labs = c("A","B","C")
image(1:4,1:3,grid,axes=FALSE, xlab="", ylab = "")
#This works but isn't the colors I want
axis(2,at=1:length(labs),labels=labs,las=2, adj=1,cex.axis=0.6,col.axis="red")

这会生成以下图像:

示例图

我希望标签 A 和 C 为黑色,B 为红色。这是我尝试过的,但它给出了“错误的长度”错误......

axiscolors = c("black","red","black")
axis(2,at=1:length(labs),labels=labs,las=2, adj=1, cex.axis=0.6, col.axis=axiscolors)

这是我使用一些“真实”数据所追求的效果......

实际热图

编辑:

作为备份,如果这在 ggplot2 中是可能的,我可能愿意重构我的代码。还有几个其他应用程序我也会使用它。

我想出了一种在旧标签顶部绘制一层红色符号的方法,但如果可能的话,我更喜欢使用颜色矢量的本机方法......

sublabs = c("B")
axis(2,at=match(sublabs,labs),labels=sublabs,las=2, adj=1, cex.axis=0.6, col.axis="red")

text()如果我可以将标签放在绘图空间之外,另一种方法是使用......

text(c(1,1,1),c(1,2,3),labs,col=c("black","red","black"))

更新:ggplot2有关适用于...的解决方案,请参见下文

4

4 回答 4

14

text如果您忽略像and这样的向量化可能性mtext,您可以通过反复调用axis. 时间上的开销将非常小,它将允许所有axis计算像往常一样进行。例如:

# original code
grid = structure(c(1:12),.Dim = c(4,3))
labs = c("A","B","C")
image(1:4,1:3,grid,axes=FALSE, xlab="", ylab = "")
axiscolors = c("black","red","black")

# new code    
Map(axis, side=2, at=1:3, col.axis=axiscolors, labels=labs, lwd=0, las=1)
axis(2,at=1:3,labels=FALSE)

导致:

在此处输入图像描述

于 2013-09-17T03:13:38.073 回答
5

接受@thelatemail 的答案是最灵活的,但text()如果您添加xpd = TRUE以允许在框架外绘图,使用它也变得非常简单。使用mtext()也可以,但它不允许您旋转标签

grid = structure(c(1:20),.Dim = c(4,5))
labs = c("A","B","C","D","E")
redlabs = c("B","D")
colorlist = c("black","red")
# one of many ways to generate the color labels
axiscolor = colorlist[labs %in% redlabs +1 ]

image(1:4,1:5,grid,axes=FALSE, xlab="", ylab = "")
axis(2,at=1:length(labs),labels=FALSE)

# This would work for sideways labels
# mtext(text=labs, side=2,at=1:length(labs),col=axiscolor,adj=.5)
text(labels=labs, col=axiscolor, x=rep(.45,length(labs)), y=1:length(labs), srt = 0, pos = 2, xpd = TRUE)

使用 text() 的解决方案

更新 ggplot2:您可以使用theme()element_text设置颜色和其他参数。像这样的东西...

 p + theme(axis.text.y = element_text(color=axiscolor)) 
于 2013-09-17T14:07:20.913 回答
3

您可以使用要应用于标签的颜色指定一个向量,然后使用循环来获取使用axis() 着色的标签。在以下示例中,我为点图的每个级别使用不同的颜色。

DF <- data.frame(habitat=c("Hab 1","Hab 2","Hab 3","Hab 4","Hab 5"), mean=c(0.53,0.28,0.30,0.35,0.39), color=colors()[c(24,257,26,504,652)])
> DF
habitat mean      color
1   Hab 1 0.53      black
2   Hab 2 0.28     green3
3   Hab 3 0.30       blue
4   Hab 4 0.35 orangered1
5   Hab 5 0.39     yellow

par(mar=c(7, 5, 4, 3))
dotchart(DF[,2], xlim=c(0.2,0.6), col=as.character(DF$color), pch=16, lcolor="white", xlab=colnames(DF[2])) # Plot the points 
for (j in 1:5){
axis(side=2, at=j, col.axis=as.character(DF$color)[j], labels=DF$habitat[j], las=1) # Add habitat as labels, each with corresponding color, on the left margin
} 
于 2014-06-03T05:44:02.923 回答
2

我非常喜欢 thelatemail 的方法,并且只能添加一个小的改进,因为固定的“at”位置(如上例中的at = 1:3)对我来说效果不佳。就我而言,我需要生成条形图并提供我自己的空间和宽度参数值。最后我使用的看起来像(例如随机数据,我希望正(非负,更准确地说)数据值的条形和标签为绿色和红色。对于这个例子,我也使用letters函数提供标签并使用las = 2)旋转标签:

x <- rnorm(26)
color <- rep("green", length(x))
color[x < 0] <- "red"

par(mar=c(6,4.1,4.1,2.1))
barplot(x, las = 2, ylim = c(min(x)-0.5, max(x)+0.5), col = color, space = 0.5, width = 2)    
Map(function(x,y,z) 
axis(1,at=x,col.axis=y,labels=z,lwd=0,las=2),
seq(from = 2, by = 3, length.out = length(x)),
color,
letters
)
axis(1,at=seq(from = 2, by = 3, length.out = length(x)),labels=FALSE)
于 2017-04-27T20:10:19.480 回答