【问题标题】:Creating violin plots on ggplot2 for vectors of different length?在ggplot2上为不同长度的向量创建小提琴图?
【发布时间】:2018-12-19 17:58:21
【问题描述】:

我有两个不同长度的向量,并想为它们创建一个小提琴图。我目前正在做的是 cbind 他们,这使得较短的向量被重复,直到它与较长的向量的长度相匹配(默认情况下由 R 中的 cbind 完成)。

library(ggplot2)

C1 <- rnorm(100)
C2 <- rnorm(500)

dat <- cbind(C1,C2)

# Violin plots for columns
mat <- reshape2::melt(data.frame(dat), id.vars = NULL)
pp <- ggplot(mat, aes(x = variable, y = value)) + geom_violin(scale="width",adjust = 1,width = 0.5,fill = "gray80")
pp

这会影响小提琴的形状吗?有没有更正确的方法来创建小提琴情节而不必人为地增加其中一个情节的长度?

【问题讨论】:

  • ggplot 需要长形数据,因此您不应该将 cbind 视为两个单独的列。在一个中重复值意味着值出现的频率比它们应该出现的频率高,这会改变形状。相反,制作 2 个数据框,带有某种 ID 列以显示它是 C1 还是 C2,并将 rbind 它们变成长数据。跳过melt,看看你绘制时会发生什么
  • 您正在 cbind 转换为宽格式,然后使用 melt 转换为长格式。使用dat = data.frame(value = c(C1, C2), variable = c(rep("C1", length(C1)), rep("C2", length(C2)))) 直接转为长格式。
  • @camille 和 Gregor 听起来像是合理的建议。我可以接受它们作为答案。

标签: r ggplot2 violin-plot


【解决方案1】:

而不是cbinding 两个不同长度的向量,这将导致回收,然后融化,制作两个数据框,在其中标记每个代表的内容和rbind 它们。这样您就可以从ggplot 期望的形状的数据开始,并且不会冒重复两组数据中较短的值的风险。

library(ggplot2)

set.seed(710)
C1 <- data.frame(value = rnorm(100), variable = "C1")
C2 <- data.frame(value = rnorm(500), variable = "C2")

dat <- rbind(C1, C2)
head(dat)
#>         value variable
#> 1 -0.97642446       C1
#> 2 -0.51938107       C1
#> 3  1.05793223       C1
#> 4 -0.88139935       C1
#> 5 -0.05997154       C1
#> 6  0.31960235       C1

ggplot(dat, aes(x = variable, y = value)) +
  geom_violin(scale = "width", adjust = 1, width = 0.5)

reprex package (v0.2.0) 于 2018 年 7 月 11 日创建。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2019-01-21
    • 2021-11-07
    • 2018-01-15
    • 2016-06-13
    相关资源
    最近更新 更多