【发布时间】:2012-09-20 11:27:39
【问题描述】:
我不知道如何表达这个问题,但我正在尝试将带有线条的标签添加到基本散点图上的对应点。到目前为止,我有以下内容:
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)
代码给出了以下情节:
这对我的目的很有效,除了标签重叠非常严重。我正在寻找一种通用方法来制作如下图:
代码位于函数中,因此它需要适用于通用数据集的任何变化。我正在查看 safe 包中 safeplot 背后的代码,但到目前为止,我无法复制他们为解决类似问题所做的工作。
我现在也尝试使用 vegan 包中的 linestack() 函数。
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() 只是给了我以下信息:
我尝试改变所有参数,但无法将标签分开。
【问题讨论】:
-
您可以使用
lines()和text()函数绘制这些线条和标签。 -
lines()和text()函数仅在绘图区域内绘制,而不在边缘绘制。 -
lines和text可以用par(xpd=TRUE)画出边距。 -
我也试过了。我不清楚
xpd=TRUE时坐标系是如何工作的。 -
与绘图区域的坐标系相同。在内部区域之外绘制时我喜欢做的是首先在绘图区域中获取我需要的所有内容,然后调用
par(new=TRUE, xpd=TRUE),然后调用plot(NA, NA, type='n', xlim=my.xlim, ylim=my.ylim),其中my.xlim和my.ylim是方便的xaxis 和yaxis 范围,用于在外部绘制边距,例如,my.xlim=c(0,1)。