具有恒定数据的小提琴情节?

时间:2014-07-16 14:47:12

标签: r ggplot2

数据(部分)不变时,小提琴情节有一些奇怪的行为。

如果我检查恒定数据并人为地添加一些小错误(例如通过添加runif( N, min = -0.001, max = 0.001 ),脚本将运行。但是,这会将其他小提琴图扭曲为垂直线(参见{ {3}}),虽然看起来应该像1


问题:

是否有可能(当小提琴情节的部分数据不变时)

  • 显示相应常量数据的简单水平线
  • 显示其他小提琴图,好像不存在常数数据一样?


R代码:

library(ggplot2)
library(grid)
library(gridExtra)

N <- 20

test_data <- data.frame(
  idx  <- c( 1:N, 1:N ),
  vals <- c( runif(N, 0, 1),
             rep(  0.5, N)),                                         # <- R script won't run
             #rep( 0.5, N) + runif( N, min = -0.001, max = 0.001 )), # <- delivers graphic (distorted)
  type <- c( rep("range",  N),
             rep("const",  N))
)

grid.arrange(
  ggplot( test_data, aes( x = idx, y = vals)) + 
    geom_line( aes(colour = type)),
  ggplot( test_data, aes( x = type, y = vals)) + 
    geom_violin( aes( fill = type),
                 position = position_dodge(width = 1))
)

distorted violin plots

the 'other' violin plot

1 个答案:

答案 0 :(得分:1)

我终于得到了一个小提琴情节,其中一些小组的方差为零(标准偏差)

  • 显示0-variance组的平面线
  • 显示其他群体的正常小提琴情节

working violin plot with 0-variance group(s) enter image description here

在我的例子中,我有3组数据 - 两组没有零差异,第三组是常数。 在累积组时,我计算标准差(方差将是相同的功能)

library(ggplot2)
library(gridExtra)

N <- 20

test_data <- data.frame()

# random data from range
for( grp_id in 1:2)
{
    group_data <- data.frame(
      idx  = 1:N,
      vals = runif(N, grp_id, grp_id + 1),
      type = paste("range", grp_id)
    )
    group_data$sd_group <- sd( group_data$vals)
    test_data = rbind( test_data, group_data)
}

# constant data
group_data = data.frame(
    idx  = 1:N,
    vals = rep( 0.5, N),
    type = "const"
)
group_data$sd_group <- sd( group_data$vals)

按照建议我添加一点偏移量来获得小组的小提琴情节&#39; const&#39;

# add a little jittering to get the flat line
if( 0 == group_data$sd_group[1])
{
    group_data$vals[1] = group_data$vals[1] + 0.00001
}
test_data = rbind( test_data, group_data)

现在唯一要做的就是将所有小提琴曲线缩放到相同的宽度

grid.arrange(
    ggplot( test_data, aes( x = idx)) + 
        geom_line( aes( y = vals, colour = type)),
    ggplot( test_data, aes( x = type, y = vals, fill = type)) + 
        geom_violin( scale = "width"),
    ncol = 1
)