如何替换geom_text指南(图例)的传奇"子弹"

Rom*_*rik 6 r ggplot2

我想替换传说(指南)中的'子弹' geom_text.现在它是一个倾斜的a,但我想要一个大的胖圈或正方形或任何其他形状,将强调颜色(更多).

library(ggplot2)

majdf <- data.frame(lvl = rep(c("A", "B"), each = 50), val = c(rnorm(50, 1), rnorm(50, 3)))
majtxt <- data.frame(species = c("sp1", "sp2", "sp3"), geq = c(0.01, 2, 2.2))

ggplot(majdf, aes(x = val)) +
  geom_density() +
  geom_vline(data = majtxt, aes(xintercept = geq)) +
  geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) +
  facet_wrap(~ lvl)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Rol*_*and 5

这只是一个黑客.

创建情节geom_point:

p1 <- ggplot(majdf, aes(x = val)) +
  geom_density() +
  geom_vline(data = majtxt, aes(xintercept = geq)) +
  geom_point(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) +
  facet_wrap(~ lvl)
Run Code Online (Sandbox Code Playgroud)

同样的geom_text:

p2 <- ggplot(majdf, aes(x = val)) +
  geom_density() +
  geom_vline(data = majtxt, aes(xintercept = geq)) +
  geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) +
  facet_wrap(~ lvl)
Run Code Online (Sandbox Code Playgroud)

变成一个grob,找到哪个元素是指南:

g1 <- ggplotGrob(p1)
g1

TableGrob (8 x 10) "layout": 13 grobs
    z         cells       name                                     grob
1   0 ( 1- 8, 1-10) background          rect[plot.background.rect.2339]
2   1 ( 4- 4, 4- 4)    panel-1                gTree[panel-1.gTree.2263]
3   2 ( 4- 4, 7- 7)    panel-2                gTree[panel-2.gTree.2278]
4   3 ( 3- 3, 4- 4)  strip_t-1    absoluteGrob[strip.absoluteGrob.2306]
5   4 ( 3- 3, 7- 7)  strip_t-2    absoluteGrob[strip.absoluteGrob.2312]
6   5 ( 4- 4, 3- 3)   axis_l-1 absoluteGrob[axis-l-1.absoluteGrob.2299]
7   6 ( 4- 4, 6- 6)   axis_l-2         zeroGrob[axis-l-2.zeroGrob.2300]
8   7 ( 5- 5, 4- 4)   axis_b-1 absoluteGrob[axis-b-1.absoluteGrob.2285]
9   8 ( 5- 5, 7- 7)   axis_b-2 absoluteGrob[axis-b-2.absoluteGrob.2292]
10  9 ( 7- 7, 4- 7)       xlab             text[axis.title.x.text.2314]
11 10 ( 4- 4, 2- 2)       ylab             text[axis.title.y.text.2316]
12 11 ( 4- 4, 9- 9)  guide-box                        gtable[guide-box]
13 12 ( 2- 2, 4- 7)      title               text[plot.title.text.2337]
Run Code Online (Sandbox Code Playgroud)

复制指南:

g2 <- ggplotGrob(p2)
g2[[1]][[12]] <- g1[[1]][[12]]
plot(g2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Bri*_*ggs 5

ggplot(majdf, aes(x = val)) +
  geom_point(data = majtxt, aes(x = geq, colour = species), 
             y = 0.2, size = 0) +
  geom_density() +
  geom_vline(data = majtxt, aes(xintercept = geq)) +
  geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), 
            angle = 90, show_guide = FALSE) +
  facet_wrap(~ lvl) +
  scale_colour_discrete(guide=guide_legend(override.aes=list(size=4)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

工作原理:添加具有适当颜色映射的点几何图形。这将在图例中添加一个点。但是,为了防止它显示在绘图上,请将点的大小设置为 0。在文本 geom 中,告诉它不要将该部分(旋转后的 a)添加到图例 ( show_guide = FALSE)。最后,图例将只有您想要的点,而不是侧面的 a;不幸的是,它的绘制大小与图中相同,即 0。因此,使用override.aes参数 to guide_legend(传递给guidein scale_colour_discrete),将点的大小设置为“大”。

这种方法不需要将碎片分成两个不同的地块并将它们缝合在一起。

指定引导参数的另一种方法是使用该guides函数,而不是将其作为参数传递给scale_colour_manual

ggplot(majdf, aes(x = val)) +
  geom_point(data = majtxt, aes(x = geq, colour = species), 
             y = 0.2, size = 0) +
  geom_density() +
  geom_vline(data = majtxt, aes(xintercept = geq)) +
  geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), 
            angle = 90, show_guide = FALSE) +
  facet_wrap(~ lvl) +
  guides(colour = guide_legend(override.aes=list(size=4)))
Run Code Online (Sandbox Code Playgroud)

生成的图形是相同的。