4

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

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)

代码给出了以下情节:

我目前拥有的。

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

我想拥有什么。

代码位于一个函数中,因此它需要适用于通用数据集的任何变化。我正在研究包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()只是给了我以下内容:

在此处输入图像描述

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

4

2 回答 2

2

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

虽然这比我现在在 SO 上可以做的工作要大,但我建议您查看veganlinestack()包中的函数以及它在方法中的使用方式。vegan:::plot.prc()

我最近使用 `linestack() 函数做了一些与您描述的非常相似的事情,以改进glmnet包中的一些图。如果您需要更多帮助,请回复评论,我将看到一起破解示例。

于 2012-09-28T14:59:33.287 回答
1

查看spread.labsTeachingDemos 包中的spread.labels函数和 plotrix 包中的函数,了解选择标签放置位置的方法。

设置par(xpd=NA)将允许您使用textlinessegments其他功能在绘图区域之外进行绘制。

此外,该功能grconvertX可能有助于找到标签和线段的水平位置。

于 2012-09-28T17:04:07.743 回答