Lebar Plot Biola dalam ggplot

Oct 03 2020

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

3 AllanCameron Oct 03 2020 at 01:36

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()