R图例问题,点的符号被线条遮盖

时间:2012-03-28 20:56:34

标签: r plot legend

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

我的解决方案是让符号更大更明显。

编辑1:它适用于R程序的情节{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:这是针对情节(type ='b')解决的,但不知何故不适用于传奇。

感谢阅读!

3 个答案:

答案 0 :(得分:2)

我能想到的唯一一件事就是手动完成短划线长度,直到最终看起来像你想要的那样。例如,这个:

> 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导出图像并修改图像以满足图形编辑软件的需要。

graph with manual dash lengths

答案 1 :(得分:1)

您还可以使用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)

生成以下内容:

graph with filled points

答案 2 :(得分:1)

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

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)

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

An example plot