2015-12-14 23 views
7

ggplot2 có thể tạo ra một âm mưu vĩ cầm đầy rất hấp dẫn:cốt truyện ggplot2 violon: chỉ điền vào trung tâm 95%?

ggplot() + geom_violin(data=data.frame(x=1, y=rnorm(10^5)), 
    aes(x=x, y=y), fill='gray90', color='black') + 
    theme_classic() 

Tôi muốn hạn chế việc điền vào trung tâm 95% của phân phối nếu có thể, để lại đề cương nguyên vẹn. Có ai có đề xuất về cách thực hiện điều này?

Trả lời

6

Điều này có làm những gì bạn muốn không? Nó đòi hỏi một số xử lý dữ liệu và bản vẽ của hai violin.

set.seed(1) 
dat <- data.frame(x=1, y=rnorm(10^5)) 

#calculate for each point if it's central or not 
dat_q <- quantile(dat$y, probs=c(0.025,0.975)) 
dat$central <- dat$y>dat_q[1] & dat$y < dat_q[2] 

#plot; one'95' violin and one 'all'-violin with transparent fill. 
p1 <- ggplot(data=dat, aes(x=x,y=y)) + 
    geom_violin(data=dat[dat$central,], color="transparent",fill="gray90")+ 
    geom_violin(color="black",fill="transparent")+ 

    theme_classic() 

enter image description here

Edit: các cạnh tròn làm phiền tôi, vì vậy đây là một cách tiếp cận thứ hai. Nếu tôi làm điều này, tôi sẽ muốn những đường thẳng. Vì vậy, tôi đã làm một số chơi với mật độ (đó là những gì các đồ thị violin được dựa trên)

d_y <- density(dat$y) 

right_side <- data.frame(x=d_y$y, y=d_y$x) #note flip of x and y, prevents coord_flip later 
right_side$central <- right_side$y > dat_q[1]&right_side$y < dat_q[2] 

#add the 'left side', this entails reversing the order of the data for 
#path and polygon 
#and making x negative 
left_side <- right_side[nrow(right_side):1,] 
left_side$x <- 0 - left_side$x 

density_dat <- rbind(right_side,left_side) 


p2 <- ggplot(density_dat, aes(x=x,y=y)) + 
    geom_polygon(data=density_dat[density_dat$central,],fill="red")+ 
    geom_path() 


p2 

enter image description here

+0

Ah, chỉ cần đánh bại tôi! – Axeman

+1

@Axeman Tuyệt vời suy nghĩ như nhau? Tôi đã thêm một phương pháp thứ hai. – Heroka

+0

@Heroka, điều này thật tuyệt! Như bạn đã đoán, tôi đã vấp vào cách tiếp cận đầu tiên của bạn nhưng không hài lòng. Cách tiếp cận thứ hai của bạn là chính xác những gì tôi muốn. Cảm ơn nhiều! – dewarrn1

2

Chỉ cần làm một lựa chọn đầu tiên. Bằng chứng về khái niệm:

df1 <- data.frame(x=1, y=rnorm(10^5)) 
df2 <- subset(df1, y > quantile(df1$y, 0.025) & y < quantile(df1$y, 0.975)) 

ggplot(mapping = aes(x = x, y = y)) + 
    geom_violin(data = df1, aes(fill = '100%'), color = NA) + 
    geom_violin(data = df2, aes(fill = '95%'), color = 'black') + 
    theme_classic() + 
    scale_fill_grey(name = 'level') 

enter image description here

Các vấn đề liên quan