在ggplot2(R)中围绕不同形状的品种放置边框

时间:2015-03-18 18:17:04

标签: r ggplot2

尝试在geom_point() ggplot2 {{}}}周围放置边框时,this question是一个非常有用的起点。我最终选择了@joran概述的方法(第二个答案)因为它允许我得到更小的轮廓(这是更好的,因为这些点在最终产品中最终会非常小)。

然而,我在使用这种技术的轻微变化时遇到了麻烦。我有两种不同的形状品种,这给我带来了一些问题。这是一个可重复的例子:

require('ggplot2')

values <- rnorm(n = 10, mean = 1, sd = 0.5) + c(1:10)

df <- data.frame(id = rep(c('hq', 'lq'), each = 5),
                 values = values,
                 period = rep(c(1:5), 2))

plot <- 
    ggplot(df, aes(x = period,
                   y = values,
                   group = id)) +
    geom_line(color = 'gray40') +
    geom_point(aes(shape = id,
                   color = id),
               size = 3) +
    geom_point(aes(shape = id),
               color = 'gray70',
               size = 3,
               show_guide = FALSE) +
    scale_color_manual(values = c('lightskyblue1', 'lightpink'),
                       labels = c('HQ', 'LQ')) +
    scale_shape_manual(values = c(15, 16, 0, 1),
                       labels = c('HQ', 'LQ')) +
    theme_bw()

最终会给出一个如下图:

enter image description here

我无法理解为什么这些点会变成纯灰色(这是我喜欢蓝色和粉红色点边界的颜色)。任何帮助保留蓝色和粉红色填充与灰色边框匹配的形状类型将不胜感激!

编辑:如果不清楚,我知道我可以使用pch 21-25来实现边界。但是,这些边界太大,厚度不可修改(据我所知)。因此,我试图将两个geom_points()分层,一个填充,另一个填充,以实现边框的外观。我可以通过分层另一组geom_point()来实现这一点:

plot <- 
    ggplot(df, aes(x = period,
                   y = values,
                   group = id)) +
    geom_line(color = 'gray40') +
    geom_point(aes(shape = id,
                   color = id),
               size = 3) +
    geom_point(shape = 1,
               color = 'gray70',
               size = 3,
               show_guide = FALSE) +
    scale_color_manual(values = c('lightskyblue1', 'lightpink'),
                       labels = c('HQ', 'LQ')) +
    scale_shape_manual(values = c(15, 16),
                       labels = c('HQ', 'LQ')) +
    theme_bw()

这里的问题是每个“边框”与相应的形状不匹配,结果图像如下所示:

enter image description here

3 个答案:

答案 0 :(得分:1)

<强>被修改

我想念你的问题。无论如何,解决方案是geom_point

的顺序
  1. 第一个进入后台,所以我用它绘制更大的灰色形状(大小5)

    geom_point(aes(shape = id),
               color = 'gray70',
               size = 5,
               show_guide = FALSE)
    
  2. 第二个绘制彩色形状:

    geom_point(aes(shape = id,
                   color = id),
               size = 3)
    
  3. 惠特:

    plot <- 
      ggplot(df, aes(x = period,
                     y = values,
                     group = id)) +
      geom_line(color = 'gray40') +
      geom_point(aes(shape = id),
                 color = 'gray70',
                 size = 5,
                 show_guide = FALSE) + 
      geom_point(aes(shape = id,
                     color = id),
                 size = 3) +
      scale_color_manual(values = c('lightskyblue1', 'lightpink'),
                         labels = c('HQ', 'LQ')) +
      scale_shape_manual(values = c(15, 16, 0, 1),
                         labels = c('HQ', 'LQ')) +
      theme_bw()
    

    使用此代码,我可以实现此结果: enter image description here

答案 1 :(得分:1)

实际上,您不必使用这么多aesaes中只有一个ggplot就足够了。除非被覆盖,否则aes将自动应用于其他geom_..

plot <- 
  ggplot(df, aes(x = period, y = values, group = id, shape = id, color=id)) +
  geom_line(color = 'gray40') +
  geom_point(color = 'gray70', size = 5, show_guide = FALSE) +
  geom_point(size = 3) +
  scale_color_manual(values = c('lightskyblue1', 'lightpink'), labels = c('HQ', 'LQ')) +
  scale_shape_manual(values = c(15, 16, 0, 1), labels = c('HQ', 'LQ')) +
  theme_bw()

enter image description here

答案 2 :(得分:0)

刚刚看到@mucio更新了他的答案 - 我认为他的答案更优雅一点,尽管这种方式可能会给你你想要的薄边框。


由于您同时使用id形状图例,因此彩色形状和灰色形状都会被填充。解决这个问题的一种方法(不可否认的是一个黑客,但到目前为止似乎没有阻止你),是创建一个具有新级别的新变量,并将其用于灰色形状的形状。 (另请注意,我必须重新排列形状规格的顺序)。

df$id2 <- ifelse(df$id == 'hq', 'hq_alt', 'lq_alt')
plot <- 
    ggplot(df, aes(x = period,
                   y = values,
                   group = id)) +
    geom_line(color = 'gray40') +

     geom_point(aes(shape = id,
                   color = id),
               size = 3) +
    geom_point(aes(shape = id2),
               color = 'gray70',
               size = 3,
               show_guide = FALSE) +
    scale_color_manual(values = c('lightskyblue1', 'lightpink'),
                       labels = c('HQ', 'LQ')) +
    scale_shape_manual(values = c(15, 0, 16, 1),
                       labels = c('HQ', 'LQ'), guide=F) +
    theme_bw()