2016-05-21 5 views
4

Mit this dataset, habe ich diese Grafik:ggplot2 in R: Verwenden Sie `geom_ribbon` für die Beschattung unter zwei verschiedenen` geom_smooth` Linien

A graph for seconds vs age of a race, with blue points representing males and pink females

ich Schatten wollen unter den geom_smooth Linien, etwa so:

The same graph, but with shading below a <code>geom_smooth</code> line for the entire dataset.

ich möchte Punkte nur unter der blauen Linie oder nur unter der rosa Linie jene Farben haben, und alles, was unter den beiden Linien dunkelgrau sein.

ich diesen Code verwendet, um die Grafik zu erstellen:

p3 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) + 
geom_point() + theme_fivethirtyeight_mod() + ggtitle('Seconds vs. Age') + 
geom_hline(yintercept = 0, size = 1.2, colour = "#535353") + 
geom_vline(xintercept = 0, size = 1.2, colour = "#535353") + 
geom_smooth(se = F) + 
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1) 

Der Code für theme_fivethirtyeight_mod() ist dies:

require(ggplot2) 
require(ggthemes) 
require(ggrepel) 
require(grid) 
require(gtable) 

theme_fivethirtyeight_mod <- function (base_size = 12, base_family = "sans") { 
(theme_foundation(base_size = base_size, base_family = base_family) + 
theme(line = element_line(colour = "black"), 
     rect = element_rect(fill = ggthemes_data$fivethirtyeight["ltgray"], linetype = 0, colour = NA), 
     text = element_text(colour = ggthemes_data$fivethirtyeight["dkgray"]), 
     axis.text = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold"), 
     axis.ticks = element_blank(), 
     axis.line = element_blank(), 
     axis.title = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold", vjust = 1.5), 
     legend.title = element_blank(), 
     legend.background = element_rect(fill="gray90", size=.5, linetype="dotted"), 
     legend.position = "bottom", 
     legend.direction = "horizontal", 
     legend.box = "vertical", 
     panel.grid = element_line(colour = NULL), 
     panel.grid.major = element_line(colour = ggthemes_data$fivethirtyeight["medgray"]), 
     panel.grid.minor = element_blank(), 
     plot.title = element_text(hjust = 0.05, size = rel(1.5), face = "bold"), 
     plot.margin = unit(c(1, 1, 1, 1), "lines"), 
     panel.background = element_rect(fill = "#F0F0F0"), 
     plot.background = element_rect(fill = "#F0F0F0"), 
     panel.border = element_rect(colour = "#F0F0F0"), 
     strip.background = element_rect())) 
} 

Vielen Dank für die Hilfe!

EDIT:

@MLavoie kommentierte einen Link zu einer Frage, die mir eine grundlegende Vorstellung davon, wie man Schatten unter den geom_smooth Linien gab durch ein predict(loess(AGE ~ SECONDS)) verwenden. predict() funktioniert wie geom_smooth und loess ist die Methode, die verwendet wird, wenn n < 1000. Dies ermöglichte mir, unter den männlichen und weiblichen Linien Schatten, aber erlaubte mir nicht, die Fläche unter beiden Kurven zu finden. Der dunkelgrau schattierte Bereich ist der Bereich unter dem geom_smooth für den gesamten Datensatz.

Ich vermute, dass, um den Bereich unter den männlichen und weiblichen Kurven zu finden, ich zuerst die Daten von der geom_smooth s (männlich und weiblich) erfassen müsste. Ich würde dann eine data.frame mit den x-Werten als Zeilen und einer Spalte für jeden Satz von y-Werten erstellen. Ich würde den minimalen y-Wert für jeden x-Wert finden und ich würde das dunkelgrau unter dieser Kurve schattieren.

Interessanterweise sind die schattierten Bereiche wie die Punkte hellblau umrandet und die Legende zeigt rot oder blau umrandete Kästchen, die mit einer dunkelgrauen Farbe gefüllt sind. Ich habe diese auf den Code anstelle des ursprünglichen geom_ribbon:

geom_ribbon(data = df[df$GENDER == 'F',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "red") + 
geom_ribbon(data = df[df$GENDER == 'M',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "blue") + 
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1) 

, dass der einzige neue Code bei der Erstellung dieser Graph beteiligt war:

A graph similar to the above, but with shading underneath <code>geom_smooth</code> lines.

Im Grunde möchte ich die blauen Umrisse entfernen von den gefüllten Bereichen und ich möchte die dunkelgraue Füllung aus den Boxen in der Legende entfernen, und wenn jemand herausfinden kann, wie ich den Bereich unter beiden Linien gerne beschatten würde. Danke noch einmal!

+0

diese (http://stackoverflow.com/questions/20355849/ggplot2-shade-area-under-density-curve-by-group) könnte – MLavoie

+0

Das einzige Problem ist, helfen, dass die Legende zeigt noch rot oder blau Boxen mit dem dunkelgrauen Inneren, wie in der Frage. Außerdem ist die Umrandung der Farbbandbereiche für alle rot. Ich werde meine Frage aktualisieren, um mich auf diese letzten Probleme zu konzentrieren, aber danke für den Link! @MLavoie –

Antwort

1

Schalten Sie die Legende entweder für die Farben oder für die Füllung aus, um zu bekommen, was Sie wollen.

Ausschalten Farben Legende:

p3 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) + 
    geom_point() + 
    theme_fivethirtyeight_mod() + 
    ggtitle('Seconds vs. Age') + 
    geom_hline(yintercept = 0, size = 1.2, colour = "#535353") + 
    geom_vline(xintercept = 0, size = 1.2, colour = "#535353") + 
    geom_smooth(se = F) + 
    geom_ribbon(data = df[df$GENDER == 'F',], 
       aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)), 
        fill = "Female"),colour = F) + 
    geom_ribbon(data = df[df$GENDER == 'M',], 
       aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)), 
        fill = "Male"),colour = F) + 
    geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), 
       colour = F) + 
    scale_fill_manual(values = c('Female' = 'red','Male' = 'blue')) + 
    guides(colour = F) 

enter image description here

Ausschalten fill Legende:

p4 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) + 
    geom_point() + 
    theme_fivethirtyeight_mod() + 
    ggtitle('Seconds vs. Age') + 
    geom_hline(yintercept = 0, size = 1.2, colour = "#535353") + 
    geom_vline(xintercept = 0, size = 1.2, colour = "#535353") + 
    geom_smooth(se = F) + 
    geom_ribbon(data = df[df$GENDER == 'F',], 
       aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), 
       fill = 'red',colour = F) + 
    geom_ribbon(data = df[df$GENDER == 'M',], 
       aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), 
        fill = 'blue',colour = F) + 
    geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), 
       colour = F) + 
    guides(fill = F) 

enter image description here

paar Punkte zu beachten:

  1. Ich bin nicht sicher, warum Sie ein drittes geom_ribbon verwenden. Wenn Sie den Schnittpunkt der Bereiche unter den anderen beiden Farbbändern schattieren möchten, schattieren Sie die Fläche unter dem Löss für die vollständigen Daten nicht geben Sie die Schnittmenge - Sie können dies beobachten, indem Sie die Grafiken weniger undurchsichtig machen (durch Angabe alpha < 1)
  2. alpha = 1 standardmäßig, so dass Sie es nicht explizit angeben müssen.
+0

Ich habe meine Frage aktualisiert, um zu erklären, wie ich denke, dass ich über das Schattieren dieses Gelenkbereichs hinausgehen würde. Ich möchte, dass der Alpha-Wert 1 ist, also hoffe ich, dass jemand weiß, wie er den Bereich unter beiden Linien findet. Danke für die Informationen über die Legende! Ich bekomme immer noch die Umrisse um die 'geom_ribbon'-Bereiche, weißt du also, wie man das entfernt? Ich glaube, dass die Umrissfarbe die Farbe des Punktes ist, wie man es auf einer "geom_smooth" Linie sehen würde, aber um den dritten "geom_ribbon" (den ich weiß, dass er repariert werden muss) ist der Umriss das Blau für Männer. –

+0

Und ich habe herausgefunden, wie man den Umriss entfernen kann. Ich musste nur das 'geom_smooth (se = F)' entfernen! –

Verwandte Themen