我通常使用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
的解决方案......
答案 0 :(得分:9)
如果忽略text
和mtext
等矢量化的可能性,您可以通过反复调用axis
来实现这一目标。开销时间将非常小,它将允许所有axis
计算按正常情况进行。 E.g:
# 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)
导致:
答案 1 :(得分:3)
接受@ thelatemail的答案是最灵活的,但如果添加text()
以允许在框架外绘图,则使用xpd = TRUE
也会非常简单。使用mtext()
也可以使用,但它不允许您rotate labels。
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)
ggplot2的更新:您可以使用theme()
和element_text
来设置颜色和其他参数。像这样......
p + theme(axis.text.y = element_text(color=axiscolor))
答案 2 :(得分:2)
您可以使用要应用于标签的颜色指定矢量,然后使用循环获取使用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
}
答案 3 :(得分:0)
我非常喜欢thelatemail的方法,并且只能在固定的&#34; at&#34;之后添加一个小的改进。位置(如上例中的at = 1:3
)对我来说效果不佳。在我的例子中,我需要生成一个条形图并提供我自己的空间和宽度参数值。最后我使用的是什么样的(随机数据的例子,其中我想要正数(非负数,更准确)数据值的条和标签为绿色和红色。否则。对于这个例子,我也使用{ {1}}功能提供标签并使用letters
)旋转标签:
las = 2