可以簡化代碼,尤其是創建 cyl_ # 列的行。這是一個示例代碼。但真正需要的是創建 12 列。并為每列制作箱線圖。優先使用data.table包
我的代碼:
library(vioplot)
library(data.table)
dt=setDT(copy(mtcars))[,.(mpg,cyl)][]
dt[,mpg,keyby=cyl]
dt[cyl == 4,cyl_4:=mpg]
dt[cyl == 6,cyl_6:=mpg]
dt[cyl == 8,cyl_8:=mpg]
dt[,.SD,.SDcols=patterns("cyl_")]
> dt[,vioplot(.SD,col="gold"),.SDcols=patterns("cyl_")]
upper lower median q1 q3
1: 33.900 21.400 26.0 22.80 30.40
2: 21.400 17.800 19.7 18.65 21.00
3: 19.025 11.625 15.2 14.40 16.25

uj5u.com熱心網友回復:
使用data.table的動態欄創建(這可能是沒有必要的):
cyls <- sort(unique(dt$cyl))
dt[,(paste0("cyl_",cyls)):=lapply(cyls,function(x) fifelse(x == cyl,mpg,NA))]
dt[,vioplot(.SD,col="gold"),.SDcols=patterns("cyl_")]

或與ggplot2:
library(ggplot2)
ggplot(dt) geom_violin(aes(x=paste0('cyl_',cyl),y=mpg),fill='gold')
xlab('cylinders')

uj5u.com熱心網友回復:
我不確定為什么 OP 要求為每個值cyl(NA每列中有許多值)創建單獨的列,但如果目標是為每個單獨的值創建一個小提琴圖,cyl我會這樣做:
library(vioplot)
library(data.table)
as.data.table(mtcars)[, vioplot(mpg ~ cyl, col="gold")]
upper lower median q1 q3 <num> <num> <num> <num> <num> 1: 33.900 21.400 26.0 22.80 30.40 2: 21.400 17.800 19.7 18.65 21.00 3: 19.025 11.625 15.2 14.40 16.25

這種方法使用 的formula引數vioplot()。不需要過濾或操作mtcars資料(除了強制到 class data.table)。
如果需要重命名 x 軸上的標簽,這可以通過
as.data.table(mtcars)[, vioplot(mpg ~ paste0("cyl_", cyl), xlab = NULL, col = "gold")]

該formula引數非常方便,因為它允許在不同變數之間輕松切換,例如,
as.data.table(mtcars)[, vioplot(hp ~ gear, col = "lightblue")]
upper lower median q1 q3 <num> <num> <num> <num> <num> 1: 245 97 180 150.00 210 2: 123 52 94 65.75 110 3: 335 91 175 113.00 264

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397807.html
上一篇:如何制作帶有標簽和計數的條形圖?
