2013-11-25 16 views
10

Ho una raccolta di dati su diversi studi. Per ogni studio sono interessato alla media di una variabile per genere e se questo differisce in modo significativo. Per ogni studio ho gli intervalli di confidenza media e del 95% per maschi e femmine.Dotplot con barre di errore, due serie, jitter leggero

Quello che vorrei fare è qualcosa di simile a questo: enter image description here

ho utilizzato diverse versioni di dotplots (grafico a punti, dotplot2, un grafico a punti), ma non abbastanza arrivarci.

Utilizzo di Dotplot da Hmisc Sono riuscito ad avere una serie e le sue anomalie, ma non riesco a capire come aggiungere la seconda serie.

Ho utilizzato Dotplot e ho ottenuto la fine verticale delle barre di errore in seguito ai consigli forniti here.

Ecco un esempio di lavoro del codice che sto usando

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

Questa traccia tre colonne di dati, la media per i maschi (avgm), e inferiore e limite superiore dell'intervallo di confidenza al 95% (lowerm e upperm). Ho altre tre serie, per gli stessi studi, che fanno lo stesso lavoro per le materie femminili (avgf, lowerf, upperf).

I risultati che ho simile a questa:

enter image description here

Ciò che manca, in poche parole:

  1. l'aggiunta di una seconda serie (avgf) con mezzi e gli intervalli di confidenza definiti su altre tre variabili per gli stessi studi

  2. aggiungendo un po 'di jitter verticale in modo che non siano uno sopra l'altro ma il lettore può vederli entrambi anche quando si sovrappongono.

+2

si prega di mostrare il codice ... – Thomas

+0

Grazie, codice aggiunto. Non funziona poiché sfortunatamente non posso condividere i dati originali a causa di accordi con gli autori originali. – PaoloCrosetto

+1

Grazie per aver aggiunto quel codice. Dovresti, tuttavia, anche essere in grado di costruire un piccolo set di dati di esempio che funziona senza dare informazioni riservate. Magari suddividere i dati di due autori, cambiare un po 'i numeri e fare un anonimo e postare * that *. (L'idea è di non indurre i potenziali rispondenti a indovinare e ricostruire su * loro * proprio il formato dei dati che hai in mano.) –

risposta

8

Purtroppo non posso aiutarti con Dotplot, ma trovo abbastanza semplice usando ggplot. Hai solo bisogno di riorganizzare i dati leggermente.

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

Grazie a @Henrik per la risposta. È una soluzione molto accurata. Spero di ottenere una risposta anche da Dotplot, poiché anch'io voglio mettere questo accanto a un altro Dotplot che ho realizzato e mi piacerebbe avere un aspetto coerente. Grazie. – PaoloCrosetto

+0

Ho finito per usare il codice yur (e ho imparato molto su ggplot2). Grazie per la tua risposta! – PaoloCrosetto

+0

@ Henrik Grazie per questa risposta! –