2013-11-25 15 views
10

Tôi có một bộ sưu tập dữ liệu trong một số nghiên cứu. Đối với mỗi nghiên cứu, tôi quan tâm đến giá trị trung bình của một biến theo giới tính và nếu điều này khác biệt đáng kể. Đối với mỗi nghiên cứu, tôi có khoảng tin cậy trung bình và 95% cho cả nam và nữ.Dotplot với các thanh lỗi, hai dòng, ánh sáng jitter

Những gì tôi muốn làm là một cái gì đó tương tự như sau: enter image description here

Tôi đã sử dụng nhiều hương vị của dotplots (dotplot, dotplot2, Dotplot) nhưng không khá đạt được điều đó.

Sử dụng Dotplot từ Hmisc Tôi đã quản lý để có một chuỗi và các thanh ghi của nó, nhưng tôi không biết cách thêm chuỗi thứ hai.

Tôi đã sử dụng Dotplot và có kết thúc thẳng đứng của các thanh lỗi theo lời khuyên được cung cấp here.

Dưới đây là một ví dụ làm việc của mã Tôi đang sử dụng

data<-data.frame(ID=c("Study1","Study2","Study3"),avgm=c(2,3,3.5),avgf=c(2.5,3.3,4)) 
data$lowerm <- data$avgm*0.9 
data$upperm <- data$avgm*1.1 
data$lowerf <- data$avgf*0.9 
data$upperf <- data$avgf*1.1 

# Create the customized panel function 
mypanel.Dotplot <- function(x, y, ...) { 
    panel.Dotplot(x,y,...) 
    tips <- attr(x, "other") 
    panel.arrows(x0 = tips[,1], y0 = y, 
       x1 = tips[,2], y1 = y, 
       length = 0.05, unit = "native", 
       angle = 90, code = 3) 
} 

library(Hmisc) 
Dotplot(data$ID ~ Cbind(data$avgm,data$lowerm,data$upperm), col="blue", pch=20, panel = mypanel.Dotplot, 
     xlab="measure",ylab="study") 

này lô ba cột dữ liệu, trung bình đối với nam (avgm), và thấp hơn và giới hạn trên của khoảng tin cậy 95% (lowerm và upperm). Tôi có ba loạt khác, cho cùng một nghiên cứu, mà làm cùng một công việc cho các đối tượng nữ (avgf, lowerf, upperf).

Các kết quả tôi có giống như thế này:

enter image description here

gì là mất tích, trong một nutshell:

  1. thêm một loạt thứ hai (avgf) với phương tiện và khoảng tin cậy xác định trên ba biến khác cho cùng một nghiên cứu

  2. thêm một số jitter dọc để chúng không nằm trên đầu trang của người khác nhưng người đọc có thể nhìn thấy cả hai ngay cả khi họ chồng lên nhau.

+2

Hãy thể hiện mã của bạn ... – Thomas

+0

Cảm ơn, mã thêm. Nó không chạy vì tôi rất tiếc là không thể chia sẻ dữ liệu gốc do các thỏa thuận với các tác giả gốc. – PaoloCrosetto

+1

Cảm ơn bạn đã thêm mã đó. Bạn nên, tuy nhiên, cũng có thể xây dựng một tập dữ liệu ví dụ nhỏ mà không làm việc mà không cho đi bất kỳ thông tin bí mật. Có thể tập hợp dữ liệu ra khỏi hai tác giả, thay đổi các số một chút và không kết nối và đăng * đó *. (Ý tưởng là không làm cho người trả lời tiềm năng đoán và tái tạo trên * của họ * sở hữu định dạng dữ liệu bạn có trong tay.) –

Trả lời

8

Rất tiếc, tôi không thể giúp bạn với Dotplot, nhưng tôi thấy nó khá đơn giản khi sử dụng ggplot. Bạn chỉ cần sắp xếp lại dữ liệu một chút.

library(ggplot2) 
# grab data for males 
df_m <- data[ , c(1, 2, 4, 5)] 
df_m$sex <- "m" 
names(df_m) <- c("ID", "avg", "lower", "upper", "sex") 
df_m 

# grab data for females 
df_f <- data[ , c(1, 3, 6, 7)] 
df_f$sex <- "f" 
names(df_f) <- c("ID", "avg", "lower", "upper", "sex") 
df_m 

# bind the data together 
df <- rbind(df_m, df_f) 

# plot 
ggplot(data = df, aes(x = ID, y = avg, ymin = lower, ymax = upper, colour = sex)) + 
    geom_point(position = position_dodge(width = 0.2)) + 
    geom_errorbar(position = position_dodge(width = 0.2), width = 0.1) + 
    coord_flip() + 
    scale_colour_manual(values = c("blue", "red")) + 
    theme_classic() 

enter image description here

# if you want horizontal grid lines you may change the last line with: 
    theme_bw() + 
    theme(panel.grid.major.y = element_line(colour = "grey", linetype = "dashed"), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor.x = element_blank()) 
+0

Cảm ơn @Henrik cho câu trả lời. Đó là một giải pháp rất gọn gàng. Tôi hy vọng tôi nhận được một câu trả lời cũng từ Dotplot vì tôi cũng muốn đặt điều này cùng với một Dotplot tôi đã thực hiện và tôi rất thích có cái nhìn & cảm nhận nhất quán. Cảm ơn. – PaoloCrosetto

+0

Tôi đã sử dụng mã yur (và tìm hiểu rất nhiều về ggplot2). Cảm ơn câu trả lời của bạn! – PaoloCrosetto

+0

@Henrik Cảm ơn câu trả lời này! –

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