R,在单个(水平)数字线上用标签绘制点

时间:2015-08-17 13:37:58

标签: r plot

出于教育目的,我试图绘制一个水平的“数字线”,其中有一些带有R标签的数据点。我来到这里;

library(plotrix)
source("spread.labels.R")
plot(0:100,axes=FALSE,type="n",xlab="",ylab="")
axis(1,pos=0) 
spread.labels(c(5,5,50,60,70,90),rep(0,6),ony=FALSE, 
labels=c("5","5","50","60","70","90"), 
offsets=rep(20,6))

这给了我一个数字线,其中较小的线条指向(并且有点“在”中)数据点应该位于数字线上的标签 - 但没有点本身。任何人都可以给我额外的或替代的R代码来解决问题: - 数据点本身仍然缺失未绘制, - 并且标签可能不会在整个数字线上均匀划分, - 线条进入标签而不仅仅指向标签

非常感谢,

Benjamin Telkamp

1 个答案:

答案 0 :(得分:4)

我通常喜欢使用基本R图形函数创建绘图,例如points()segments()lines()abline()rect(),{{ 3}},polygon()text()。您可以使用自己定义的粒度坐标向量中的segments()lines()轻松创建曲线(例如圆圈)和更复杂的形状。例如,请参阅mtext()。这样可以更好地控制您创建的绘图元素,但是,与更多“预先打包”的解决方案相比,它通常需要更多的工作和仔细的编码,因此这是一种权衡。

对于您的情况,我觉得您对spread.labels()尝试做的事情感到满意,您只需要进行以下更改:

  1. 在标记点添加点符号。
  2. 防止标签和线条重叠。
  3. 以下是如何做到这一点:

    ## define plot data
    xlim <- c(0,100);
    ylim <- c(0,100);
    px <- c(5,5,50,60,70,90);
    py <- c(0,0,0,0,0,0);
    lx.buf <- 5;
    lx <- seq(xlim[1]+lx.buf,xlim[2]-lx.buf,len=length(px));
    ly <- 20;
    
    ## create basic plot outline
    par(xaxs='i',yaxs='i',mar=c(5,1,1,1));
    plot(NA,xlim=xlim,ylim=ylim,axes=F,ann=F);
    axis(1);
    
    ## plot elements
    segments(px,py,lx,ly);
    points(px,py,pch=16,xpd=NA);
    text(lx,ly,px,pos=3);
    

    Plot angle between vectors