2015-04-21 17 views
5

Gentile utente StackOverflow,Barplot raggruppato in R con barre di errore

Vorrei disegnare un barcode raggruppato con barre di errore. Ecco il tipo di figura sono stato in grado di ottenere fino ad oggi, e questo è ok per quello che mi serve:

enter image description here

E qui è il mio script:

#create dataframe 
Gene<-c("Gene1","Gene2","Gene1","Gene2") 
count1<-c(12,14,16,34) 
count2<-c(4,7,9,23) 
count3<-c(36,22,54,12) 
count4<-c(12,24,35,23) 
Species<-c("A","A","B","B") 
df<-data.frame(Gene,count1,count2,count3,count4,Species) 
df 

mean1<-mean(as.numeric(df[1,][c(2,3,4,5)])) 
mean2<-mean(as.numeric(df[2,][c(2,3,4,5)])) 
mean3<-mean(as.numeric(df[3,][c(2,3,4,5)])) 
mean4<-mean(as.numeric(df[4,][c(2,3,4,5)])) 
Gene1SpeciesA.stdev<-sd(as.numeric(df[1,][c(2,3,4,5)])) 
Gene2SpeciesA.stdev<-sd(as.numeric(df[2,][c(2,3,4,5)])) 
Gene1SpeciesB.stdev<-sd(as.numeric(df[3,][c(2,3,4,5)])) 
Gene2SpeciesB.stdev<-sd(as.numeric(df[4,][c(2,3,4,5)])) 

ToPlot<-c(mean1,mean2,mean3,mean4) 

#plot barplot 
plot<-matrix(ToPlot,2,2,byrow=TRUE) #with 2 being replaced by the number of genes! 
tplot<-t(plot) 
BarPlot <- barplot(tplot, beside=TRUE,ylab="count", 
       names.arg=c("Gene1","Gene2"),col=c("blue","red")) 

#add legend 
legend("topright", 
     legend = c("SpeciesA","SpeciesB"), 
     fill = c("blue","red")) 

#add error bars 
ee<-matrix(c(Gene1SpeciesA.stdev,Gene2SpeciesA.stdev,Gene1SpeciesB.stdev,Gene2SpeciesB.stdev),2,2,byrow=TRUE)*1.96/sqrt(4) 
tee<-t(ee) 
error.bar(BarPlot,tplot,tee) 

Il problema è che ho bisogno di fare questo per 50 geni e 4 specie, quindi la mia sceneggiatura sarà super super lunga e immagino che non sia ottimizzata ... Ho provato a trovare aiuto here ma non riesco a capire un modo migliore per fai quello che mi piacerebbe. Se non avessi bisogno di barre di errore, avrei potuto adattare this script ma la parte difficile è combinare ggplot con bellissimi bar e barre di errore! ;)

Se hai qualche idea per ottimizzare il mio script, lo apprezzerei davvero! :)

Grazie mille!

+1

fate attenzione facendo 't (trama)' voi completamente invertita gene;) –

risposta

7

Partendo dalla sua definizione di df, è possibile farlo in poche righe:

library(ggplot2) 

cols = c(2,3,4,5) 
df1 = transform(df, mean=rowMeans(df[cols]), sd=apply(df[cols],1, sd)) 

# df1 looks like this 
# Gene count1 count2 count3 count4 Species mean  sd 
#1 Gene1  12  4  36  12  A 16.00 13.856406 
#2 Gene2  14  7  22  24  A 16.75 7.804913 
#3 Gene1  16  9  54  35  B 28.50 20.240224 
#4 Gene2  34  23  12  23  B 23.00 8.981462 

ggplot(df1, aes(x=as.factor(Gene), y=mean, fill=Species)) + 
    geom_bar(position=position_dodge(), stat="identity", colour='black') + 
    geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9)) 

enter image description here

+0

Grazie! Ho ricevuto questo errore ora:/ '> df1 <- transform (df, mean = rowMeans (df [cols]), sd = apply (df [cols], 1, sd))' 'Errore in' [. data.frame' (df, cols): oggetto 'cols' non trovato' – tlorin

+0

scusa mi sono dimenticato di mettere quello che era 'cols' (quello che l'errore dice in realtà;)) è ora modificato! –

+0

Perfezione! Molte grazie!! :) – tlorin

Problemi correlati