Chiều rộng ô violin trong ggplot

Oct 03 2020

Tôi đang cố gắng vẽ một âm mưu vĩ cầm đầy đủ bên cạnh nhiều âm mưu nửa vĩ cầm bằng cách sử dụng ggplot. Tôi đang vẽ toàn bộ âm mưu vĩ cầm bằng cách sử dụng geom_violin () và vẽ sơ đồ nửa vĩ cầm bằng cách sử dụng geom_violinhalf từ gói "see", với scale = 'width'. Tuy nhiên, điều này tạo ra một con số với ô vĩ cầm đầy đủ có vẻ mỏng hơn đáng kể so với ô nửa vĩ cầm, như được thấy trong đoạn mã bên dưới. Tôi đã thử ba tùy chọn "quy mô" tích hợp trong ggplot.

Có cách nào để vẽ một âm mưu vĩ cầm đầy đủ và một số âm mưu nửa vĩ cầm bằng cách sử dụng một chức năng không? Hoặc có cách nào khác để tôi có thể tự thiết lập chiều rộng của ô vĩ cầm đầy đủ theo cách thủ công không?

Cảm ơn!

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

BIÊN TẬP

Mã trước đó không chính xác, xin lỗi. Làm thế nào để cây vĩ cầm đầu tiên có thể được mở rộng nếu khung dữ liệu thay vào đó như sau, với mỗi ô vĩ cầm được nhóm bởi 'd' thay vì '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}}

Trả lời

3 AllanCameron Oct 03 2020 at 01:36

Chiều rộng sẽ cân bằng theo mặc định nếu bạn chuyển đổi x thành một hệ số:

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

Ngoài ra, bạn có thể giữ xsố và sử dụng bộ widthphân tích cú pháp của geom_violin. Ở đây tôi sẽ đặt nó hơi rộng width = 8cho mục đích trình diễn, nhưng lý tưởng dường như là về 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()


BIÊN TẬP

Để thêm các điểm từ cột d, chúng ta có thể làm:

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