ggplot小提琴图无法绘制。

3

我想使用R包ggplot2画一个小提琴图,代码如下:

norm2 = function(v) return(sqrt(sum(v*v)))
myfct = function(d) {
  vec_length = Inf
  while (vec_length > 1){
    vec_length = norm2(runif(n=d,min=-1,max=1))
  }
  return(vec_length)
}

df = data.frame(x = rep.int(1:5, 2))
df$vec_length = sapply(df$x, myfct)
ggplot(df, aes(factor(x),vec_length)) + geom_violin(trim=FALSE)

但我遇到了问题。
Warning:
In max(data$density) :
  no non-missing argument for max; return -Inf

我的情节是

enter image description here

我做错了什么?


norm2是一个包而不是函数?使用base::norm会抛出错误。 - Fons MA
@FonsMA:抱歉,已添加该函数。 - Make42
@RLave:抱歉,已添加该函数。 - Make42
1个回答

2
你的数据每个 x 值只有两个 vec_length(y)。这是一个“特殊情况”,在这种情况下,小提琴图会缩成一条线。在这种情况下,也可以将 geom_violin() 实现为 geom_line(),但实际上并没有这样实现:
library(ggplot2)
ggplot(df1, aes(factor(x), vec_length)) + geom_line()

enter image description here

要画一把小提琴,至少需要三个y值:
df2 <- data.frame(x=rep.int(1:5, 3))
df2$vec_length <- sapply(df2$x, myfct)
ggplot(df2, aes(factor(x), vec_length)) + geom_violin(trim=FALSE)

enter image description here


数据

library("SpatioTemporal")
set.seed(42)
myfct <- function(d) {
  vec_length <- Inf
  while (vec_length > 1){
    vec_length <- norm2(runif(n=d, min=- 1, max=1))
  }
  return(vec_length)
}

df1 <- data.frame(x=rep.int(1:5, 2))
df1$vec_length <- sapply(df1$x, myfct)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接