自定义轴,带有标签线

时间:2012-09-28 14:52:23

标签: r label line margin axis

我不确定如何表达这个问题,但我试图将带有线条的标签添加到基本散点图上的相应点。到目前为止,我有以下内容:

example <- data.frame(name=paste("label_",1:200,sep=""),plot=rep(FALSE,200),rank=c(1:200),score=exp(seq(6,0,length.out=200)))
example$plot[c(1:3,7,8,35,37,150:155,183)] <- TRUE

plot(x=example$score,y=example$rank,ylim=rev(range(c(1:nrow(example)))),axes=FALSE,ylab="",xlab="Score",frame.plot=FALSE)
axis(side=1,labels=TRUE)
axis(side=2,labels=example$name[which(example$plot==TRUE)],at=example$rank[which(example$plot==TRUE)],las=1,tick=FALSE)
points(x=example$score[which(example$plot==TRUE)],y=example$rank[which(example$plot==TRUE)],col="Red",cex=1.5,pch=16)

代码给出了以下图:

What I currently have.

这对我的目的很有用,除了标签重叠非常严重。我正在寻找一种制作如下图形的通用方法:

What I would like to have.

代码位于函数内,因此它需要适用于常规数据集的任何变体。我正在查看safeplot包中safe背后的代码,但到目前为止,我无法复制他们为解决类似问题所做的工作。

我现在也尝试使用linestack()包中的vegan函数。

par(mar=c(5,10,4,2))
plot(x=example$score,y=example$rank,ylim=rev(range(c(1:nrow(example)))),axes=FALSE,ylab="",xlab="Score",frame.plot=FALSE)
axis(side=1,labels=TRUE)
points(x=example$score[which(example$plot==TRUE)],y=example$rank[which(example$plot==TRUE)],col="Red",cex=1.5,pch=16)
linestack(x=example$rank[which(example$plot==TRUE)],labels=example$name[which(example$plot==TRUE)],add=TRUE,side="left",air=1.1,at=0,hoff=2)

但是,linestack()只是给了我以下内容:

enter image description here

我尝试改变所有参数,但无法将标签分开。

2 个答案:

答案 0 :(得分:2)

这里有几个问题,特别是通常你不能在绘图区域之外绘制,因为剪裁会遮挡超出限制的任何东西(即边缘)。您还需要在该边距中留出大量空间以容纳标签和线条。

虽然这比我现在可以在SO上做的更重要,但我可以建议您查看素食主义包中的linestack()函数以及如何使用它vegan:::plot.prc()方法。

我最近使用`linestack()函数执行与您描述的非常相似的操作,以改进 glmnet 包中的一些图。如果你需要更多的帮助评论,我会看到一起黑客攻击的例子。

答案 1 :(得分:1)

查看TeachingDemos软件包中的spread.labs函数和plotrix软件包中的spread.labels函数,了解如何选择标签的位置。

通过设置par(xpd=NA),您可以使用textlinessegments和其他功能在绘图区域外绘制。

函数grconvertX可能有助于查找标签和线段的水平位置。