数据框的小提琴图

7

我有一个数据框,例如:

df = data.frame(AAA=rnorm(100,1,1),BBB=rnorm(100,2,1.5),CCC=rnorm(100,1.5,1.2))

我希望能够绘制每个列的联合小提琴图,这与it技术有关。

到目前为止,我已经做了以下工作:

names(df)[1] = 'x'
do.call('vioplot', c(df,col="red",drawRect=FALSE))

我接下来想做的是将 df 的列名作为 x 轴标签而不是默认的 vioplot x 轴标签,并且以一种不重叠的方式呈现。我认为可以通过在绘图中展示 df 的列或倾斜 x 轴标签来实现这一点,但我无法弄清楚如何操作。
4个回答

9

可能更容易使用ggplot。

df = data.frame(AAA=rnorm(100,1,1),
                BBB=rnorm(100,2,1.5),
                CCC=rnorm(100,1.5,1.2))

需要将数据转换为 ggplot 可以处理的格式:
df.m <- reshape2::melt(df, id.vars = NULL)

并绘制:
library(ggplot2)
ggplot(df.m, aes(x = variable, y = value)) + geom_violin()

enter image description here


5

我最喜欢ggplot的解决方案,但以下是如何使用do.call进行操作:

do.call(vioplot,c(unname(df),col='red',drawRect=FALSE,names=list(names(df))))

enter image description here

值得注意的是,您无需执行names(df)[1] = 'x',因为您可以使用unname删除名称。


2
你尝试过放弃使用do.call调用,分别处理它们吗?
vioplot(df[,"AAA"], df[,"BBB"], df[,"CCC"], 
        col = "red", drawRect = FALSE,names = names(df))

enter image description here


我现在试图避免使用循环(我的真实数据框有许多列),但是如果我找不到更好的解决方案,我想我可以使用循环。 - user1701545

1
另一个简单的选择是使用 ggpubr 中的 ggviolin 函数,使用像这样的长格式数据:
df = data.frame(AAA=rnorm(100,1,1),BBB=rnorm(100,2,1.5),CCC=rnorm(100,1.5,1.2))
library(dplyr)
library(tidyr)
library(ggpubr)
df %>%
  pivot_longer(cols = everything()) %>%
  ggviolin(x = "name",
           y = "value")

reprex package (v2.0.1) 于2022年8月14日创建


很确定reshape2现在已经被弃用了,最好使用tidyr代替。 - user438383
@user438383,是的,你说得对!已经改成了pivot_longer,谢谢! - Quinten

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