Lebar Plot Biola dalam ggplot
Saya mencoba untuk merencanakan satu plot biola penuh di samping beberapa plot setengah biola menggunakan ggplot. Saya memplot plot biola penuh menggunakan geom_violin (), dan plot setengah plot biola menggunakan geom_violinhalf dari paket "see", dengan scale = 'width'. Namun, ini menghasilkan gambar dengan plot biola penuh yang tampak jauh lebih tipis daripada plot biola setengah, seperti yang terlihat pada kode di bawah ini. Saya sudah mencoba tiga opsi "skala" bawaan di ggplot.
Adakah cara untuk membuat plot satu plot biola penuh dan beberapa plot setengah biola menggunakan satu fungsi? Atau adakah cara lain untuk mengatur lebar plot biola secara manual?
Terima kasih!
#install.packages("vioplot")
#install.packages('ggplot2')
#install.packages('scales')
library(ggplot2)
library(vioplot)
library(scales)
df1 = as.data.frame(matrix(NA, nrow = 1000, ncol = 2))
colnames(df1) = c('x','y')
df1[,2] = rnorm(1000,10,5)
df1[,1] = rep(-5, 1000)
df2 = as.data.frame(matrix(NA, nrow = 10000, ncol = 2))
colnames(df2) = c('x','y')
df2[,1] = sample(seq(0,70,5),10000,replace=TRUE)
df2[,2] = rnorm(10000,10,5)
df = rbind(df1, df2)
ggplot(df, aes(x=x,y=y))+
geom_violinhalf(data=subset(df,df$x != -5), aes(x=x, group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2))+ geom_violin(data = subset(df, df$x== -5), color = alpha('red', 0.2), fill = alpha('red', 0.2))+
geom_point(size = 1.2, col = alpha('grey', 0.2))+
theme_classic()
EDIT
Kode sebelumnya salah, maaf. Bagaimana biola pertama dapat diperluas jika kerangka data adalah sebagai berikut, dengan masing-masing plot biola dikelompokkan berdasarkan 'd' dan bukan 'x':
df1 = as.data.frame(matrix(NA, nrow = 10000, ncol = 3))
colnames(df1) = c('d','y','x')
df1[,2] = rnorm(10000,10,5)
df1[,1] = sample(seq(-5,70,.1),10000, replace=TRUE)
for(i in 1:nrow(df1)){
if(df1[i,'d'] < 0){df1[i,"x"] <- -5}else
if(df1[i,"d"] >= 0 & df1[i,"d"] < 5){df1[i,"x"] <- 0}else
if(df1[i,"d"] >= 5 & df1[i,"d"] < 10){df1[i,"x"] <- 5}else
if(df1[i,"d"] >= 10 & df1[i,"d"] < 15){df1[i,"x"] <- 10}else
if(df1[i,"d"] >=15 & df1[i,"d"] < 20){df1[i,"x"] <- 15}else
if(df1[i,"d"] >= 20 & df1[i,"d"] < 25){df1[i,"x"] <- 20}else
if(df1[i,"d"] >= 25 & df1[i,"d"] < 30){df1[i,"x"] <- 25}else
if(df1[i,"d"] >= 30 & df1[i,"d"] < 35){df1[i,"x"] <- 30}else
if(df1[i,"d"] >= 35 & df1[i,"d"] < 40){df1[i,"x"] <- 35}else
if(df1[i,"d"] >= 40 & df1[i,"d"] < 45){df1[i,"x"] <- 40}else
if(df1[i,"d"] >= 45 & df1[i,"d"] < 50){df1[i,"x"] <- 45}else
if(df1[i,"d"] >= 50 & df1[i,"d"] < 55){df1[i,"x"] <- 50}else
if(df1[i,"d"] >= 55 & df1[i,"d"] < 60){df1[i,"x"] <- 55}else
if(df1[i,"d"] >= 60 & df1[i,"d"] < 65){df1[i,"x"] <- 60}else
if(df1[i,"d"] >= 65 & df1[i,"d"] < 70){df1[i,"x"] <- 65}else
if(df1[i,"d"] >= 70 & df1[i,"d"] < 75){df1[i,"x"] <- 70}else
if(df1[i,"d"] >= 75 & df1[i,"d"] < 80){df1[i,"x"] <- 75}}
Jawaban
Lebar akan disamakan secara default jika Anda mengubah x menjadi faktor:
ggplot(df, aes(x=factor(x),y=y)) +
geom_violinhalf(data=subset(df,df$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df, df$x== -5),
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()
Atau, Anda dapat menyimpan xnumerik dan menggunakan widthpengurai dari geom_violin. Di sini saya akan mengaturnya agak terlalu lebar width = 8untuk tujuan demonstrasi, tetapi yang ideal tampaknya tentang width = 5:
ggplot(df, aes(x = x, y = y)) +
geom_violinhalf(data = subset(df,df$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df, df$x == -5), width = 8,
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()
EDIT
Untuk menambahkan poin dari kolom d, kita bisa melakukan:
ggplot(df1, aes(x=x,y=y)) +
geom_violinhalf(data=subset(df1,df1$x != -5), aes(group = x), scale = 'width', fill = alpha('red', 0.2), color = alpha('red',0.2)) + geom_violin(data = subset(df1, df1$x== -5), width = 5,
color = alpha('red', 0.2), fill = alpha('red', 0.2)) +
geom_point(aes(x = d), size = 1.2, col = alpha('grey', 0.2)) +
theme_classic()