2017-05-27 3 views
1

Intro:Reformieren Daten eine Eichkurve mit geom_errorbar plotten() in ggplot2

ich einen Datenrahmen von Auswertungsstatistiken für Messungen unterschiedlicher Luftqualität drei habe. Die Gerätenamen lauten aa34, aa35 und 48c. Sie messen jeweils Kohlenmonoxid in ppm. Ich habe die Daten in einem breiten Format, wobei jeder Vektor der Mittelwert, die Standardabweichung, der Standardfehler oder das 95% -Konfidenzintervall für jedes der drei Instrumente ist.

Ich mochte diese zusammenfassenden Statistiken plotten ggplot() und geom_errorbar(), aber ich bin ein paar Probleme mit den Daten in langes Format bekommen und ein ID-Variable für die Farbzuordnung in ggplot() bereitstellt. Ich folge this Tutorial. Unten ist die Figur, die ich reproduzieren möchte (die Meerschweinchenzähne werden natürlich durch giftige Dämpfe ersetzt). Ich bleibe stecken und versuche, eine zusätzliche Y-Variable hinzuzufügen, und lasse sie farblich von einer ID Variablen koordiniert werden. Meine gewünschte Ausgabe würde den Vektor supp aus dem Beispiel durch zwei der drei Vektoren id ersetzen, nämlich diejenigen, die aa34 und aa35 enthalten. Mein Äquivalent zum dose Vektor wäre , unsere x Variable. Mein Äquivalent zum len Vektor wäre die Vektoren aa34.co.mean und aa35.co.mean im langen Format.

link

Die Daten:

## Here's what my data frame looks like. 
## I know it's ugly, but if you copy and paste it into your console it should work! 
df_cal <- structure(list(ref.co.mean = c(1.23638284617457, 1.46466241535712, 
2.16020882959014, 2.55054760052641, 3.13141175081258, 3.86968879644661, 
6.5914211520901), ref.co.sd = c(0.0196205483139859, 0.0229279198586359, 
0.0172965018302434, 0.0164690175286326, 0.00583116470707786, 
0.00975072766851073, 0.0388826652553337), ref.co.se = c(0.00346845569085442, 
0.00193776290206006, 0.00166435666462165, 0.00127061228762621, 
0.000583116470707786, 0.00229826855196908, 0.00614788918523735 
), ref.co.ci = c(0.00707396201972773, 0.00383130164529687, 
0.00329939297398704, 
0.0025085329371034, 0.00115702958592763, 0.00484892279298878, 
0.0124352796323718), id = c("48c", "48c", "48c", "48c", "48c", 
"48c", "48c"), aa34.co.mean = c(0, 0.248857142857143, 0.823777777777778, 
1.256, 1.886, 2.446, 4.54), aa34.co.sd = c(0, 0.0716567783084826, 
0.0660714166547489, 0.0777970497665622, 0.0518459255872629, 0, 
0.0690217357069497), aa34.co.se = c(0, 0.00605610310675521, 
0.0063577250318932, 0.00600217269807407, 0.00518459255872628, 0, 
0.0109132946446067), aa34.co.ci = c(0, 0.0119739921598931, 
0.0126034483753748, 0.0118499152368743, 0.0102873564420935, 0, 
0.0220742219853317), id = c("aa34", "aa34", "aa34", "aa34", "aa34", "aa34", 
"aa34"), aa35.co.mean = c(0.2915625, 0.801035714285714, 1.39911111111111, 
1.80436904761905, 2.45672, 3.02355555555556, 5.134975), aa35.co.sd = 
c(0.0691998633940125, 0.0474980316455754, 0.0846624379229758, 
0.0822798331713915, 0.0595577165445419, 
0.0178768075145867, 0.0243007072942329), aa35.co.se = c(0.0122329231657723, 
0.00401431635364878, 0.00814664688751334, 0.00634802694633388, 
0.00595577165445419, 0.00421360393984362, 0.00384227919014218), aa35.co.ci = 
c(0.0249492112853266, 0.00793701687349159, 0.0161497773125, 
0.0125327252345785, 0.0118175430765459, 0.00888992723110191, 
0.00777174323014678), id = c("aa35", "aa35", "aa35", "aa35", 
"aa35", "aa35", "aa35")), .Names = c("ref.co.mean", "ref.co.sd", 
"ref.co.se", "ref.co.ci", "id", "aa34.co.mean", "aa34.co.sd", 
"aa34.co.se", "aa34.co.ci", "id", "aa35.co.mean", "aa35.co.sd", 
"aa35.co.se", "aa35.co.ci", "id"), row.names = c(1L, 33L, 173L, 
281L, 449L, 549L, 567L), class = "data.frame") 

Hier ist mein erster Versuch:

## This code only gets half of the job done... 
## 95% Confidence Intervals for Error Bars: 
p <- ggplot(df_cal, aes(x=ref.co.mean, y=aa34.co.mean)) + 
    theme_bw() + 
    geom_errorbar(aes(ymin=aa34.co.mean-aa34.co.ci, 
         ymax=aa34.co.mean+aa34.co.ci), width =.05) + 
    xlab("Reference CO (ppm)") + 
    ylab("AA34 CO (ppm)") + 
    geom_smooth(method='lm', formula = y~x, se = FALSE) + 
    geom_point(size=2, shape = 21, fill="White") + 
    geom_abline(intercept = 0, slope = 1, color, linetype=2, color = "firebrick") + 
    ggtitle("CO Calibration @ 0% RH") + 
    theme(plot.title = element_text(hjust = 0.5)) + 
    annotate("rect", xmin = 4.80, xmax = 5.70, ymin = 0.70, ymax = 1.70, 
     fill="white", colour="red") + 
    annotate("text", x=5.25, y=1.50, label= "R^2 == 0.994", parse=T) + 
    annotate("text", x=5.25, y=1.20, label= "alpha == -0.9490", parse=T) + 
    annotate("text", x=5.25, y=0.90, label= "beta == 0.849", parse=T) 
p 

link

Vielen Dank im Voraus!

+1

Können Sie Ihre Frage bearbeiten, um die Ausgabe von 'dput enthalten (df_cal)' machen dies leicht reproduzierbar? –

+1

Außerdem frage ich mich, wo Sie Ihre Zusammenfassung Statistiken berechnet haben? War es "Excel"? Dies könnte mit Hilfe der 'SummarySE' -Funktion aus dem 'Rmisc'-Paket wie in Ihrem Beispiel-Link viel einfacher gemacht werden. –

+0

@ J.Con Danke für den 'dput()' Tipp. Es ist nicht schön, aber es scheint zu funktionieren, wenn Sie in die Konsole kopieren und einfügen. Ich verwende immer noch "R", um meine Zusammenfassungsstatistiken zu berechnen. Ich filtere manuell die "Plateaus" aus einer 7-stufigen Zeitreihe mit 'dplyr'. Ich verwende dann einige Grundfunktionen, um Vektoren der Standardabweichung, des Standardfehlers und der 95% -Konfidenzintervalle für jedes der drei Instrumente in jedem der 7 Schritte zu erzeugen. Ich mache dann eine 'row_bind()' auf jedem der 7 Kalibrierungsschritte, gefolgt von einem 'unique()', das nur eine Beobachtung pro Kalibrierungsschritt liefert. – spacedSparking

Antwort

1

Das Problem bei der hier zu langer Formatumschaltung ist, dass man dann kombiniert eine Variable Länge 7 für die x-Achse und der Länge 2 Variablen für die Y-Achse 14 hat. Daher bindet diese Lösung die Zeilen so, dass die Referenzdaten (x-Achse) zweimal enthalten sind. Es ist dann eine Frage der Verwendung von colour und group in der ggplot Ästhetik.

library(ggplot2) 

df_aa34_2<-df_cal[,c(1:4,6:10)]#select first 'aa' group including reference data (48c) 
df_aa35_2<-df_cal[,c(1:4,11:15)]#select second 'aa' group including reference data (48c) 
names(df_aa34_2)<-names(df_aa35_2)#colnames must be the same for rbind function 
DF<-rbind(df_aa34_2,df_aa35_2)#bind rows 

p <- ggplot(DF,aes(x=ref.co.mean,y=aa35.co.mean,colour=id,group=id)) + 
    geom_errorbar(aes(ymin=aa35.co.mean-aa35.co.ci, 
        ymax=aa35.co.mean+aa35.co.ci), width =.5) + 
    xlab("Reference CO (ppm)") + 
    ylab("AA34 & 35 CO (ppm)") + 
    geom_smooth(method='lm', formula = y~x, se = FALSE) + 
    geom_point(size=2, shape = 21, fill="White") + 
    geom_abline(intercept = 0, slope = 1, color, linetype=2, color = "firebrick") + 
    ggtitle("CO Calibration @ 0% RH") + 
    theme(plot.title = element_text(hjust = 0.5)) + 
    annotate("rect", xmin = 4.80, xmax = 5.70, ymin = 0.70, ymax = 1.70, 
      fill="white", colour="red") + 
    annotate("text", x=5.25, y=1.50, label= "R^2 == 0.994", parse=T) + 
    annotate("text", x=5.25, y=1.20, label= "alpha == -0.9490", parse=T) + 
    annotate("text", x=5.25, y=0.90, label= "beta == 0.849", parse=T)+ 
    theme_bw() 
p 

enter image description here

+1

Das sieht gut aus, danke! Ich mochte Ihre Verwendung von 'rbind()' anstatt zu versuchen, 'reshape2' oder' tidyr' zu verwenden. Ich habe die 'melt()' -Funktion mit 'left_join()' kombiniert, um die Daten in einem ähnlichen Format zu erhalten, aber Ihre Version enthält weniger Codezeilen. Nun, um einige zusätzliche "annotieren()" Zeilen einzuschließen, um die zweite "lm()" Ausgabe einzuschließen. – spacedSparking