R 带有线到标签的自定义轴

R 带有线到标签的自定义轴,r,label,line,margin,axis,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=examp

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

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)
但是,
linestack()
给了我以下信息:

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)


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

这里有几个问题,特别是通常无法在打印区域之外绘制,因为剪裁会遮挡限制之外的任何内容(即边距)。您还需要在该页边距中留出大量空间来容纳标签和线条

虽然这是一项比我现在能做的更大的工作,但我建议您看看
linestack()
函数在vegan包中的作用,以及它在
vegan:::plot.prc()方法中的使用方法


我最近使用'linestack()函数做了一些与您描述的非常类似的事情,以改进glmnet包中的一些绘图。如果您需要更多帮助,请回复,我将一起查看黑客攻击示例。

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

设置
par(xpd=NA)
将允许您使用
文本
直线
线段
和其他功能在打印区域之外进行绘制


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

谢谢您的回复。我将检查linestack(),并告诉您我是否可以让它工作。在我的实际代码中,我确实增加了边距,只是没有为示例添加代码行。再次感谢!我尝试了
linestack()
函数,但未能使其正常工作。我用我运行的代码更新了我的问题。当你有时间的时候,我会非常感谢你给我举个例子。这似乎仍然是最有效的解决方案。提前谢谢,我发现问题了。当分离标签时,
linestack()
函数使用
strheight
函数作为乘数。当我在绘图调用中将
ylim
分配到反面时,它导致
strheight
变为负数-因此标签不会分开。该函数的工作原理类似于一个带有负
air
值的符咒。谢谢大家!@PatrickT我的编辑被拒绝。我所做的只是从
vegan
包中重写
linestack
函数。您只需修复
ht即可使用
line()
text()
函数绘制这些线条和标签。
line()
text()
函数只在绘图区域内绘制,而不在边距内。
line
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
是方便在页边距外打印的X轴和Y轴范围,例如
my.xlim=c(0,1)