我不确定如何表达这个问题,但我试图将带有线条的标签添加到基本散点图上的相应点。到目前为止,我有以下内容:
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()
只是给了我以下内容:
我尝试改变所有参数,但无法将标签分开。
答案 0 :(得分:2)
这里有几个问题,特别是通常你不能在绘图区域之外绘制,因为剪裁会遮挡超出限制的任何东西(即边缘)。您还需要在该边距中留出大量空间以容纳标签和线条。
虽然这比我现在可以在SO上做的更重要,但我可以建议您查看素食主义包中的linestack()
函数以及如何使用它vegan:::plot.prc()
方法。
我最近使用`linestack()函数执行与您描述的非常相似的操作,以改进 glmnet 包中的一些图。如果你需要更多的帮助评论,我会看到一起黑客攻击的例子。
答案 1 :(得分:1)
查看TeachingDemos软件包中的spread.labs
函数和plotrix软件包中的spread.labels
函数,了解如何选择标签的位置。
通过设置par(xpd=NA)
,您可以使用text
,lines
,segments
和其他功能在绘图区域外绘制。
函数grconvertX
可能有助于查找标签和线段的水平位置。