【问题标题】:R legend issue, symbols of points are masked by linesR图例问题,点的符号被线掩盖
【发布时间】:2012-04-12 12:26:36
【问题描述】:

有没有办法以这样的方式绘制线条,使它们从点的一侧开始,或者让符号在前景中?

我的解决方案是让符号更大更醒目。

编辑 1:用于 R 程序的 plot {graphics}。

编辑 2:每个流行请求的代码。

legend(2,.4,bty='n', c('sugar','citrus','none'), pch=c('s','c','u'), pt.bg='white',lty= c(1,2,3), lwd=1.5, title="Condition",pt.cex=c(1.5),cex=1.5)

编辑 3:这已解决 plot(type='b') 但不知何故不适用于图例。

感谢阅读!

【问题讨论】:

  • 不会投反对票,但您需要指定您正在使用的图形系统...至少!
  • 需要数据和代码。为了皮特,这是一个编码网站。
  • 或者你可以让线条变细而不是让符号变大。

标签: r plot legend


【解决方案1】:

我唯一能想到的就是手动调整破折号的长度,直到它们最终看起来像你想要的那样。例如,这个:

> plot(1,1)
> legend(c("A", "B"), col = 1:2, x = 1, y = .8, lty="99", pch=1:2)

生成下面的图像。

lty 参数允许您将行和短划线的长度指定为十六进制字符。在这种情况下,它是说创建一个长度为9 的行,然后创建一个长度为9 的空间,然后重复。看起来 9 最适合放置在普通 pch 符号周围的空间。

请注意,您可能需要根据图像、符号等的大小进行调整。我的建议最终是从 R 导出图像并润色图像以满足您在图形编辑软件中的需求。

【讨论】:

  • 如果您真的想以一种可重现的方式将角色置于前景中,您可能需要在线上的符号后面绘制一个白色多边形。为此,您最好自定义legend() 函数以使其满足您的需求。它不是编译或内置函数,因此您只需键入legend 并将该代码复制到编辑器中即可获取源代码。
  • 这是一个非常酷的解决方法。不是很便携或可重现(例如,取决于 lwd),但对于单个图例来说很容易破解!
【解决方案2】:

您还可以使用 R 提供的填充点 (pch=21:25) 并使用 pc.bg 指定填充颜色,该填充颜色在创建图例时传递给 points 调用。

plot(1,1)
legend(c("A", "B"), col = 1:2, x = 1, y = .8, lty=1, pt.bg=1:2, pch=21:22)

生成以下内容:

【讨论】:

    【解决方案3】:

    根据@JeffAllen 的建议,这是一种获得我认为您可能想要的东西的方法。它需要修改legend() 函数以返回点的位置(这些由body(legend)[[46]] 中的x1y1 给出)。

    legend2 <- legend
    body(legend2)[[49]] <- quote(
      invisible(list(rect = list(w = w, h = h, left = left, top = top),
      text = list(x = xt, y = yt), points = list(x = x1, y = y1)))
    )
    

    画一个情节:

    plot(-100:100, -100:100, type = "b")
    

    在绘制图例时,在线条上绘制白色圆圈(pch = 21pt.bg = 'white'),并将 legend2() 不可见地返回的值分配给对象。另请注意对pt.lwdpt.cex 的更改。

    myLegend <- legend2(1, .8, bty = 'n', c('sugar','citrus','none'), pch = 21,
      pt.bg = 'white', pt.lwd = 0, lty = c(1, 2, 3), lwd = 1.5, title = "Condition",
      pt.cex = c(1.8), cex = 1.5)
    

    最后,使用points() 绘制您想在图例中使用的字符,并提供对象myLegend 的x 和y 值。

    points(myLegend$points$x, myLegend$points$y, pch = c('s','c','u'), cex = 1.5)
    

    这应该会让你得到类似的东西:

    【讨论】:

    • 如果我已经创建了一个新的图例功能,那不是更容易让图例先放置白色圆圈然后绘制预期的符号。例如在调用函数points2 p.s.之前更改[46]并绘制白色圆圈。哇谢谢!这就像做手术一样。
    • 为了回答您的问题并保持手术类比,这将是一种微创解决方案。如果您想执行更广泛的操作并将您的建议纳入上述建议(并可能将其打包),我认为那会很棒!
    猜你喜欢
    • 2021-11-03
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2019-03-21
    相关资源
    最近更新 更多