我有以下数据结构:
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')
但是为了让过度绘图段线的结束是正确的,这很棘手。 (我故意让这条线太短而无法演示)
修改
这些群体不以对称方式分发,尽管我的例子强烈建议如此。
答案 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')
答案 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)