首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充geom_violin图中的特定区域

填充geom_violin图中的特定区域
EN

Stack Overflow用户
提问于 2016-03-24 14:55:30
回答 1查看 916关注 0票数 5

如何以固定的截止点为基础,用不同的颜色填充geom_violin ggplot2中的图?

例如,给定设置:

代码语言:javascript
复制
library(ggplot2)

set.seed(123)
dat <- data.frame(x = rep(1:3,each = 100),
                  y = c(rnorm(100,-1),rnorm(100,0),rnorm(100,1)))
dat$f <- with(dat,ifelse(y >= 0,'Above','Below'))

我想用这个基本情节:

代码语言:javascript
复制
ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y))

每把小提琴的颜色在零度以上和零下都不同。天真的尝试,映射fill的美学,分裂和回避小提琴的情节:

代码语言:javascript
复制
ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y, fill = f))

这不是我想要的。我想要一个小提琴的每一个x值的情节,但内部充满不同的颜色以上和低于零。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-24 14:55:30

有一种方法可以做到。

代码语言:javascript
复制
library(ggplot2)
library(plyr)

#Data setup
set.seed(123)
dat <- data.frame(x = rep(1:3,each = 100),
                  y = c(rnorm(100,-1),rnorm(100,0),rnorm(100,1)))

首先,我们将使用ggplot::ggplot_build来捕获绘制小提琴情节的所有计算变量:

代码语言:javascript
复制
p <- ggplot() + 
    geom_violin(data = dat,aes(x = factor(x),y = y))
p_build <- ggplot2::ggplot_build(p)$data[[1]]

接下来,如果我们看一下源代码 for geom_violin,我们会发现它在把它交给geom_polygon绘制小提琴区域的实际轮廓之前,对这个计算过的数据帧进行了一些特定的转换。

因此,我们将模仿这个过程,只需手动绘制填充的多边形:

代码语言:javascript
复制
#This comes directly from the source of geom_violin
p_build <- transform(p_build,
                     xminv = x - violinwidth * (x - xmin),
                     xmaxv = x + violinwidth * (xmax - x))

p_build <- rbind(plyr::arrange(transform(p_build, x = xminv), y),
                 plyr::arrange(transform(p_build, x = xmaxv), -y))

我在源代码中省略了一个关于复制第一行的小细节,以确保多边形是关闭的。

现在我们做了两个最后的修改:

代码语言:javascript
复制
#Add our fill variable
p_build$fill_group <- ifelse(p_build$y >= 0,'Above','Below')
#This is necessary to ensure that instead of trying to draw
# 3 polygons, we're telling ggplot to draw six polygons
p_build$group1 <- with(p_build,interaction(factor(group),factor(fill_group)))

最后是阴谋:

代码语言:javascript
复制
#Note the use of the group aesthetic here with our computed version,
# group1
p_fill <- ggplot() + 
    geom_polygon(data = p_build,
                 aes(x = x,y = y,group = group1,fill = fill_group))
p_fill

请注意,一般来说,这将很好地处理任何分类x轴标签。因此,您通常需要使用连续的x轴来完成绘图,然后如果需要分类标签,则手动添加它们。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36203195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档