不要绘制多边形的特定部分

时间:2018-05-09 23:26:19

标签: r ggplot2

我有以下数据结构:

y <- rep(1:10, 2)
group <- rep(c('a', 'b'), each = 10)
dens <- c(c(seq(from = 0, to = 0.8, by = 0.1), 0),
           c(seq(from = -0, to = -0.8, by = -0.1), 0))
my_dat <- data.frame(group, dens, y, stringsAsFactors = FALSE )

这些是计算出的密度分布,以便制作分组的小提琴图,例如在 Split violin plot with ggplot2

# Plot 1:
  require(ggplot2)
  ggplot(my_dat, aes(x = dens, y = y, fill = group)) +
  geom_polygon(color = 'black', show.legend = FALSE)

现在这已经简化了,因为我的数据包含数百行以获得平滑的轮廓。 (但是,我的情况中有一条中心垂直线。)我现在想要删除这条垂直中心线。
(我想问题是删除任何指定的多边形部分。)

我的例子中的一个想法是用垂直线覆盖它:

#Plot 2
  ggplot(my_dat, aes(x = dens, y = y, fill = group)) +
  geom_polygon(color = 'black', show.legend = FALSE) +
  geom_segment(x = 0, 
               xend = 0, 
               y = min(y) + 0.2, 
               yend = max(y) - 0.2, 
               color = '#00BFC4')

enter image description here

但是为了让过度绘图段线的结束是正确的,这很棘手。 (我故意让这条线太短而无法演示)

修改

这些群体以对称方式分发,尽管我的例子强烈建议如此。

2 个答案:

答案 0 :(得分:2)

您总是可以在顶部绘制另一个多边形

x <- with(my_dat, chull(dens, y))
my_dat2 <- my_dat[c(x, x[1L]), ]

ggplot(my_dat, aes(x = dens, y = y, fill = group)) +
  geom_polygon(show.legend = FALSE) +
  geom_polygon(data = my_dat2, aes(group = 1), size = 1,
               fill = 'transparent',
               # fill = NA,  ## or this
               color = 'black')

enter image description here

答案 1 :(得分:1)

我认为更简单的解决方案是首先绘制所有轮廓,然后绘制所有填充区域。这适用于任何任意多边形形状。

y <- rep(1:10, 2)
group <- rep(c('a', 'b'), each = 10)
dens <- c(c(seq(from = 0, to = 0.8, by = 0.1), 0),
         c(seq(from = -0, to = -0.8, by = -0.1), 0))
my_dat <- data.frame(group, dens, y, stringsAsFactors = FALSE )

require(ggplot2)
ggplot(my_dat, aes(x = dens, y = y)) +
  geom_polygon(color = 'black', fill = NA, size = 2) +
  geom_polygon(aes(fill = group), color = NA)

enter image description here