2016-10-07 1 views
0

Einfache Frage, aber ich bin ein Neuling in R, so dass es mich ein wenig Bestürzung gibt. Ich versuche, eine Reihe von Kreisdiagrammen in R zu erstellen, um meine Datenvisualisierungsfähigkeiten zu üben.Facinging auf Pie Charts in R

Ich habe einen Datenrahmen, der wie folgt aussieht:

carrier n_cancelled n_early n_ontime n_late 
    <chr>  <int> <int> <int> <int> 
1  9E  1044  54 12891 4471 
2  AA   636  16 26965 5112 
3  AS   2  12  606  94 
4  B6   466  155 41661 12353 
5  DL   349  36 39931 7794 
6  EV  2817  66 35646 15644 
7  F9   3  1  489 192 
8  FL   73  16  2321 850 
9  HA   0  1  317  24 
10  MQ  1234  53 19790 5320 
11  OO   3  0  23  6 
12  UA   686  22 45762 12195 
13  US   663  9 17444 2420 
14  VX   31  7  4231 893 
15  WN   192  0  8833 3250 
16  YV   56  2  387 156 

Was ich suche ist eine Reihe von Kreisdiagrammen, wie die unten für jeden Träger.

looks like this

Im Moment habe ich Code, der wie folgt aussieht ...

status <- c("Cancelled", "Early", "On-Time", "Late") 
ggplot(counts_by_carrier, aes(x = factor(1), y = c(n_cancelled, n_early, n_ontime, n_late), fill = status)) + 
    geom_bar(width = 1, stat = "identity") + 
    coord_polar("y", start = 0) + 
    blank_theme + 
    facet_grid(facets=. ~ carrier) 

Aber es gibt Error: Aesthetics must be either length 1 or the same as the data (16): x, y, fill

Welchen Sinn als Fehler macht. Ich füttere es als einen Y-Wert einen Vektor aller Werte n_cancelled usw. und es weiß nicht, wie man das für ein einzelnes Kreisdiagramm behandelt.

Aber wie ich es repariere ist derzeit jenseits von mir. Wie zwinge ich dazu, nur eine Zeile nach der anderen zu betrachten und für jede Zeile eine andere auszugeben?

+1

Die Bilder sind keine Codes/Daten und auf der Fragenseite (und auf der SO R FAQ/Tag-Seite) finden Sie Informationen zum Einbinden von Daten in Ihr Beispiel. Waffle-Charts oder einfache Balkendiagramme können auch ein besserer Weg sein. – hrbrmstr

+1

Sie müssen zuerst Ihre Daten in ein langes Format konvertieren. Verwenden Sie zum Beispiel 'reshape2 :: melt' oder' tidyr :: gather'. 'Carrier' ist deine ID-Spalte (schmelze diese nicht). Geben Sie dann die Spalte für den verbleibenden Restwert nur als y und die Variable als x an. Facette nach Träger –

Antwort

0

Bitte versuchen Sie Ihre Daten in einem Format zu schreiben, dass die Menschen tatsächlich Verwendung, Ihnen zu helfen, zB ,:

df <- read.table(
    text = 
" carrier n_cancelled n_early n_ontime n_late 
1  9E  1044  54 12891 4471 
2  AA   636  16 26965 5112 
3  AS   2  12  606  94 
4  B6   466  155 41661 12353 
5  DL   349  36 39931 7794 
6  EV  2817  66 35646 15644 
7  F9   3  1  489 192 
8  FL   73  16  2321 850 
9  HA   0  1  317  24 
10  MQ  1234  53 19790 5320 
11  OO   3  0  23  6 
12  UA   686  22 45762 12195 
13  US   663  9 17444 2420 
14  VX   31  7  4231 893 
15  WN   192  0  8833 3250 
16  YV   56  2  387 156" 
) 

Wie @docendo kommentiert, müssen Sie die Daten auf „long“ konvertieren Format, zum Beispiel wie folgt aus dplyr/tidyr:

df %>% 
    gather("Outcome", "Count", - carrier) 

die nur drei Spalten jetzt haben wird - die Spaltenüberschriften werden die Einträge in „Ergebnis“ werden, und die Werte werden die Zählungen, wie so werden:

carrier  Outcome Count 
1  9E n_cancelled 1044 
2  AA n_cancelled 636 
3  AS n_cancelled  2 
4  B6 n_cancelled 466 
5  DL n_cancelled 349 
6  EV n_cancelled 2817 

Dann können Sie diese Informationen weitergeben ggplot die Handlung Sie machen wollen (beachten Sie, dass ich die führende "n_" aus jeder Gruppe am entfernen):

df %>% 
    gather("Outcome", "Count", - carrier) %>% 
    mutate(Outcome = gsub("^n_","", Outcome)) %>% 
    ggplot(aes(fill = Outcome 
      , y = Count 
      , x = 1)) + 
    geom_bar(stat = "identity" 
      , position = "dodge") + 
    facet_wrap(~carrier 
      , scales = "free_y") + 
    xlab("") 

enter image description here

Ich werde nicht machen dies ein Kreisdiagramm jedoch (obwohl Sie wahrscheinlich leicht zu konvertieren). Sie sind fast nie eine gute Idee, und wenn es Ihr Ziel ist, Ihre Datenvisualisierung zu verbessern, würde ich dringend davon abraten, Tortendiagramme zu verwenden.