相关疑难解决方法(0)

用ggplot2分割小提琴情节

我想用ggplot创建一个分裂小提琴密度图,就像seaborn文档的这个页面上的第四个例子一样.

这是一些数据:

set.seed(20160229)

my_data = data.frame(
    y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 1.5)),
    x=c(rep('a', 2000), rep('b', 2000)),
    m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000))
)
Run Code Online (Sandbox Code Playgroud)

我可以像这样绘制躲闪的小提琴:

library('ggplot2')

ggplot(my_data, aes(x, y, fill=m)) +
  geom_violin()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是在视觉上比较并排分布中不同点的宽度很难.我无法在ggplot中找到任何拆分小提琴的例子 - 这可能吗?

我找到了一个基本的R图形解决方案,但功能很长,我想突出显示分布模式,这些模式很容易在ggplot中作为附加层添加,但如果我需要弄清楚如何编辑该功能将更难.

r ggplot2 violin-plot ggproto

37
推荐指数
2
解决办法
1万
查看次数

ggplot 用水平平均线分割小提琴图

我使用 ggplot 创建了这些半小提琴图。但是,我不想包含显示中位数的箱线图,而是包含一条带有平均值的水平线。这意味着每个彩色一半都有自己的平均线:金色一半的平均线不会与灰色一半的平均线完全对齐。重要的是,我希望平均线仅位于密度图中。我怎样才能实现这个目标?我无法弄清楚,我将不胜感激任何帮助!

以下是一些示例数据:

set.seed(20160229)

my_data = data.frame(
  y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 
1.5)),
  x=c(rep('a', 2000), rep('b', 2000)),
  m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000))
)
Run Code Online (Sandbox Code Playgroud)

这是 geom_violin 的扩展,用于创建 split_geom_violin:

GeomSplitViolin <- ggproto("GeomSplitViolin", GeomViolin, draw_group = function(self, data, ..., draw_quantiles = NULL){
  data <- transform(data, xminv = x - violinwidth * (x - xmin), xmaxv = x + violinwidth * (xmax - x))
  grp <- data[1,'group']
  newdata <- plyr::arrange(transform(data, x = if(grp%%2==1) xminv else xmaxv), if(grp%%2==1) y else -y)
  newdata …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 violin-plot

1
推荐指数
1
解决办法
6892
查看次数

标签 统计

ggplot2 ×2

r ×2

violin-plot ×2

ggproto ×1