2017-09-04 3 views
4

Ich habe diskrete Daten, die wie folgt aussehen:Wie sec_axis() für diskrete Daten in ggplot2 R zu verwenden?

height <- c(1,2,3,4,5,6,7,8) 
weight <- c(100,200,300,400,500,600,700,800) 
person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess") 
set <- c(1,1,1,1,2,2,2,2) 
dat <- data.frame(set,person,height,weight) 

Ich versuche, ein Diagramm mit dem gleichen x-Achse (Person) zu zeichnen, und 2 verschiedene y-Achse (Gewicht und Größe). Alle Beispiele, die ich finde, versuchen, die secondary axis (sec_axis) oder diskrete Daten unter Verwendung von Basis-Plots zu plotten. Gibt es eine einfache Möglichkeit, sec_axis für diskrete Daten auf ggplot2 zu verwenden? Edit: Jemand in den Kommentaren vorgeschlagen, ich versuche die vorgeschlagene Antwort. Allerdings habe ich in diesen Fehler jetzt laufen

Hier ist meine aktuellen Code ist:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
    geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("height",sec_axis(~.*1.2, name="height")) 
p2 

I get the error: Error in x < range[1] : 
    comparison (3) is possible only for atomic and list types 

Alternativ jetzt habe ich das Beispiel modifizierte this example posted.

p <- ggplot(dat, aes(x = person)) 
p <- p + geom_line(aes(y = height, colour = "Height")) 

# adding the relative weight data, transformed to match roughly the range of the height 
p <- p + geom_line(aes(y = weight/100, colour = "Weight")) 

# now adding the secondary axis, following the example in the help file ?scale_y_continuous 
# and, very important, reverting the above transformation 
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*100, name = "Relative weight [%]")) 

# modifying colours and theme options 
p <- p + scale_colour_manual(values = c("blue", "red")) 
p <- p + labs(y = "Height [inches]", 
       x = "Person", 
       colour = "Parameter") 
p <- p + theme(legend.position = c(0.8, 0.9))+ facet_wrap(~set, scales="free") 
p 

ich einen Fehler übereinstimmen, die sagt

Ich bekomme die Vorlage, aber keine Punkte geplottet

+0

Das sind kontinuierliche Daten (Zahlen), nicht diskret (Kategorien). – Brian

+0

Ich erkannte, dass ich die falsche Quelle verlinkte. Ich habe das richtige verlinkt und meine Antwort mit dem Fehler aktualisiert, wenn ich es verwende – Ash

+0

Add 'sec.axis = 'vor deiner' sec_axis (...) '. Ohne explizites Benennen des Arguments wird das zweite Argument in 'scale_y_continuous()' verwendet, und 'breaks = sec_axis (~. * 1.2, name =" height ") löst diesen Fehler aus, weil es im Kontext keinen Sinn ergibt. –

Antwort

0

R-Funktionsargumente werden nach Position eingefügt, wenn Argumentnamen nicht explizit angegeben werden. Wie von @ Z.Lin in den Kommentaren erwähnt, benötigen Sie sec.axis= vor Ihrer sec_axis Funktion, um anzuzeigen, dass Sie diese Funktion in das sec.axis Argument von scale_y_continuous eingeben. Wenn Sie das nicht tun, wird es in das zweite Argument scale_y_continuous eingegeben, das standardmäßig breaks= ist. Die Fehlermeldung wird somit im Zusammenhang mit nicht für das breaks Argument in einem akzeptablen Datentyp Fütterung:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
    geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("weight", sec.axis = sec_axis(~.*1.2, name="height")) 
p2 

![enter image description here

Das erste Argument (name=) von scale_y_continuous ist für die ersten y-Skala, wobei wie das sec.axis= Argument ist für die Sekunde y-Skala. Ich habe deinen ersten y-Skalennamen geändert, um das zu korrigieren.

+0

Aber das scheint das Gewicht und die Höhe nicht zu zeichnen. Ich brauche sowohl das Gewicht als auch die Höhe, um auf der gleichen X-Achse aufgetragen zu werden. – Ash

+0

@Ash Es ist nur das Etikett, das nicht korrekt angegeben ist. Siehe meine bearbeitete Antwort. – useR

+0

Nein. Ich glaube nicht, dass Sie meinen Standpunkt sehen. Für jede Person, z. In Set1, für Jack, sollte ich zwei Punkte sehen, einen, der seiner Höhe entspricht (zum Beispiel rot markiert) und den anderen zu seinem Gewicht (sagen wir in schwarz markiert). Die Handlung hier ergibt stattdessen eine einzelne Punkte, vielleicht eine Beziehung zwischen Gewicht und Höhe? Das ist nicht was ich will. – Ash

Verwandte Themen