【问题标题】:R symbol background for custom symbols自定义符号的 R 符号背景
【发布时间】:2016-06-04 19:57:54
【问题描述】:

我有一个 R 图,我将值用作符号。这些点也有误差线:

显然,问题在于错误栏(我为此使用箭头)穿过数字,看起来很难看,难以阅读。

这是我的代码,有什么想法吗?

x = c(45.58333, 89.83333, 114.03333,138.65000,161.50000,185.15000,191.50000)
y_mean = c(3.350000,6.450000,7.200000,7.033333,8.400000,7.083333,6.750000)
y_sd = c(0.1802776,0.1732051,0.2500000,0.2020726,0.3500000,0.2020726,0.1000000)

values = data.frame(x, y_mean, y_sd)

plot(values$x, values$y_mean, type="n")

arrows(values$x, values$y_mean - values$y_sd, 
  values$x, values$y_mean + values$y_sd, 
  length=0.05, angle=90,
  code=3, col="red")

lines(values$x, values$y_mean, type="b",
  pch=" ",
  col="red", bg="white")

text(values$x, values$y_mean, label=round(values$y_mean), col="red")

编辑: 我按照要求执行了上面显示的确切代码:

【问题讨论】:

  • 任何可重现的数据可以使用?
  • 是的,当然,我添加了它:-)。
  • values$y_mean, values$y_sd?
  • 抱歉,我的代码实际上要复杂得多(从 SQL db 中提取、聚合多条曲线等),所以我只是在这里编写了这段代码,以免其他所有内容惹恼您……现在它应该工作
  • 我建议您运行您提供的数据以及您的代码,看看您是否得到与您发布的相同的情节。我想你不会。

标签: r plot graphics


【解决方案1】:

我会使用水平对齐并添加小点来跟踪原始位置

points(values$x, values$y_mean, pch=19, col="red", cex=0.5)
text(values$x, values$y_mean, label=round(values$y_mean), col="red", adj = -0.2)

【讨论】:

    【解决方案2】:

    一个想法是在绘制文本之前将要绘制文本的绘图内容变白。这可以通过rect() 完成。尽管使用这种方法可能会完全消除误差线。

    我们可以使用strwidth() and strheight() 来为空白矩形获取合适的大小。

    x <- c(45.58333, 89.83333, 114.03333,138.65000,161.50000,185.15000,191.50000);
    y_mean <- c(3.350000,6.450000,7.200000,7.033333,8.400000,7.083333,6.750000);
    y_sd <- c(0.1802776,0.1732051,0.2500000,0.2020726,0.3500000,0.2020726,0.1000000);
    xlim <- range(x);
    ylim <- c(min(y_mean-y_sd),max(y_mean+y_sd));
    plot(NA,xlim=xlim,ylim=ylim,xlab='x',ylab='y');
    arrows(x,y_mean-y_sd,x,y_mean+y_sd,length=0.05,angle=90,code=3,col='red');
    lines(x,y_mean,type='b',pch=' ',col='red',bg='white');
    ls <- as.character(round(y_mean));
    ex <- 0.4; ## whiteout expansion factor
    lsw <- strwidth(ls); w <- lsw/2*(1+ex);
    lsh <- strheight(ls); h <- lsh/2*(1+ex);
    rect(x-w,y_mean-h,x+w,y_mean+h,col='white',border=NA);
    text(x,y_mean,ls,col='red');
    

    【讨论】:

    • 谢谢,太好了! :-D
    【解决方案3】:

    只需应用这些更改:

    plot(values$x, values$y_mean, type="n", 
    xlim = c(min(values$x), max(values$x) + 20), 
    ylim = c(min(values$y_mean)-1, max(values$y_mean)+1))
    
    text(values$x, values$y_mean, label=round(values$y_mean), col="blue",  pos = 3)
    

    【讨论】:

    • 不是我想要的,而是另一种解决方法:-)。
    • 嗯,微小的变化带来了解决方案。您将问题陈述如下:The problem is, obviously, that the error bars (I use arrows for that) cross through the numbers and that just looks ugly and makes them hard to read.。现在,它看起来并不难看,而且很容易阅读。任务完成:)
    猜你喜欢
    • 2020-03-02
    • 2019-01-29
    • 1970-01-01
    • 2013-01-25
    • 2012-07-21
    • 2013-01-10
    • 1970-01-01
    • 2022-01-08
    • 2021-04-29
    相关资源
    最近更新 更多