为每个图例标签显示两个符号

Posted

技术标签:

【中文标题】为每个图例标签显示两个符号【英文标题】:Show two symbols for each legend label 【发布时间】:2012-03-11 19:49:35 【问题描述】:

使用pch 我可以绘制任何符号并在图例中分配任何标签。但是如何为每个图例标签绘制两个符号?例如,在下面的图中,我希望将 ■ ▲ ● 与红色版本配对,因此对于这六个符号,我在图例中只显示了三个标签“a”、“b”、“c”。目前,基本的情节图例似乎只允许我为每个标签绘制一个符号:

plot(rnorm(50),pch=c(15:17),col=1:2)
legend('topleft',pch=c(15:17),col=1:2,legend=c("a","b","c"),cex=1.5)

【问题讨论】:

是什么阻止您使用points()text() 的组合自己构建图例? (或者这是一个“可接受的”解决方案?)另一个想法是使用ggplot2discretecolor 规模。 @chl:您的第一点 - 我认为更强大/自动的解决方案是可能的。你的第二点 - 老实说,我不喜欢 ggplot2,因为默认情况下它会增加很多图表垃圾,所以我避免使用它。也许你对 lattice/grid 有类似的想法? 嗯。我想知道是否可以调整 ggplot2 主题以使您更快乐。除了背景和网格线,你认为什么是图表垃圾?虽然我认为下面@Josh O'Brien 提供的格子解决方案应该很适合您。 我不得不问:这真的是呈现数据的最佳方式吗?您仍然需要为每个“a”“b”“c”呈现不同颜色的含义,所以为什么不在图例中的 abc 旁边使用非填充字符,然后在此处或其他地方解释黑色之间的区别和红色。 这是绝对有效的问题@Carl,我不得不承认空点是我最初的策略。但是我有一个相当有问题的合作者对此有不同的看法,对于这个人来说,传说应该完全代表情节上的要点。我的另一个选择是为每种情况设置单独的图例。混蛋…… 【参考方案1】:

这对lattice 来说并不太难,因为它的key = 参数采用任意数量的列来包含在图例中。

library(lattice)

myPCH <- 15:17
Data  <- rnorm(50)
Index <- seq(length(Data))

xyplot(Data ~ Index, 
       pch = myPCH, col=1:2,
       key = list(space = "right", adj=1,
                  text = list(c("a", "b", "c"), cex=1.5),
                  points = list(pch = myPCH),
                  points = list(pch = myPCH,col=2)))

我不知道如何将图例包含在绘图区域内,但是对于这种情节,无论如何最好将它放在外面。 (编辑: @chl in cmets 请指出几种方法来做到这一点。例如,要在图的左下角绘制键,请将上面的 space = "right" 替换为corner = c(0,0)x = 0, y=0.2)

【讨论】:

是的,谢谢@Josh(再次)!我需要更多地探索格子。您还解决了我的另一个问题,即在不改变字体大小的情况下改变图例符号的大小:-) 甜蜜。像你一样,无论出于何种原因,我也碰巧更喜欢 lattice 图形默认值的简洁外观(尽管我确信这些可以很容易地调整)。在 ggplot 的支持下,它有更直观的语法,大量的粉丝(并因此支持)基于 SO,并且似乎正在更积极的开发中。我开始认为我可能最终会在这些日子里冒险…… (+1) 很好的回应。 (顺便说一句,您可以使用 cornerx=, y= 更改图例位置;例如,key=list(x=.1, y=.9, adj=1, ... 会将图例放在绘图区域内。) @chl -- 谢谢!我已将该信息添加到上面的答案中。您已经说服我,我需要一劳永逸地打印出 ?xyplot 文档,并从上到下直接阅读! 我不知道@Josh,我不相信(还)。每次我看到用 ggplot2 完成某些事情时,Tufte 和 Cleveland 都会尖叫,一只小猫死了。甚至 ggplot2 的手册也有 ugly examples。这可能是由于(a)人们不知道如何使图表看起来不错(b)ggplot2 更直观、更发达,但默认情况下缺乏视觉元素的适当协调。【参考方案2】:

就像 chl 指出的那样,也可以构建自定义图例。 'legend' 函数不可见地返回图例框的边界以及图例文本的坐标。可以绘制没有符号的图例文本,然后手动将符号与“点”添加到返回的坐标中。这不需要任何额外的图形包:

plot(rnorm(50), pch=c(15:17), col=1:2)
# Plot legend text, inset could be used to shift legend text to the right
pos <- legend('topleft', legend=c("a","b","c"), cex=1.5)
# Plot symbols in two columns, shifted to the left by 3 and 1 respectively
points(x=rep(pos$text$x, times=2) - c(3,1), 
    y=rep(pos$text$y, times=2), 
    pch=rep(c(15:17), times=2), col=rep(1:2, times=3))

【讨论】:

以上是关于为每个图例标签显示两个符号的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 绘图时,图例仅显示一个标签

如何修改散点图图例以显示相同类型句柄的不同格式?

格式轴刻度标签

R Plotly:拆分图例:符号和颜色

将两个不同的条目放在图例中的同一标签下

更改 plotly-R 中的图例