2016-07-30 10 views
0

Ich versuche ein Balkendiagramm zu erstellen, das die monatlichen ein- und ausgehenden Anrufe anzeigt. Wenn ich ein gestapeltes Balkendiagramm erstelle, möchte ich in der Lage sein, die Stapel für die Top-3-Kontakte (mit der höchsten Anrufdauer) anzuzeigen und den Rest als andere anzuzeigen. Gibt es eine Möglichkeit, dies in R zu automatisieren?Zeige nur Top 3 Einträge und bleib als "Others" im gestapelten Barplot mit ggplot2

Mein jetziger Diagramm sieht wie folgt aus:

Call Summary Plot

Meine Datenrahmen (callsummary) heruntergeladen werden kann (3 kb) aus dem unten stehenden Link:

https://dl.dropboxusercontent.com/u/4077057/callsummary.csv 

Mein Code für ggplot ist:

ggplot(callsummary) + 
    aes(x = Bill, y = Duration) + 
    geom_bar(stat = "identity", aes(fill =Contact)) + 
    facet_grid(~Direction) + 
    labs(list(title = "Monthly Call Summary", x = "Month", y = "Total Call duration in Minutes")) + 
    geom_hline(data = subset(monthlysummary, Direction == "In"), aes(yintercept = mean(Duration))) + 
    geom_hline(data = subset(monthlysummary, Direction == "Out"), aes(yintercept = mean(Duration))) 

Beachten Sie, dass ich eine andere Datafra erstellt habe Ich habe monatliche Zusammenfassung nur aufgerufen, um in der Lage zu sein, einen y-Abschnitt hinzuzufügen, der gleich der durchschnittlichen Anrufdauer in beiden "In" - und "Out" -Gittern ist.

Die monthlysummary Datenrahmen wie folgt aussieht:

Direction Bill Duration Amount 
     <fctr> <fctr> <dbl> <dbl> 
1  Out April  9.3 1.40 
2  In April  55.3 0.00 
3  Out May  32.5 4.89 
4  In May  76.9 0.00 
5  Out June  17.4 2.62 
6  In June 114.3 0.00 
+0

Zusätzliche Reihen von „Out“ Kategorie –

+0

Die bevorzugte Art und Weise hinzugefügt, um Ihre Daten zu schreiben sind mit 'dput' – Sumedh

+0

würde ich ausgewichen barplots statt gestapelt barplots vorschlagen, so dass Sie Vergleiche entlang einen nicht ausgerichtet y-Achse machen könnten. Wenn Sie Zusammenfassungen des Mittelwerts erstellen, sollten Sie in Erwägung ziehen, gruppierte Boxplots zu plotten. – shayaa

Antwort

1
# Read the csv file 
callsummary <- read.csv("callsummary.csv", header = T) 
# Remove the first column which are row numbers 
callsummary <- callsummary[,-1]  

library(dplyr) 
library(ggplot2) 


callsummary$Contact <- as.character(callsummary$Contact) 

df <- callsummary %>% 
    group_by(Direction, Bill) %>% 
    arrange(desc(Amount)) %>% 
    mutate(Index = 1:n(), Contact = ifelse(Index > 3, "Other", Contact)) 

df2 <- df %>% group_by(Direction) %>% summarise(Y = mean(Amount)) 


ggplot(df, aes(x = Bill, y = Amount)) + 
    geom_bar(stat = "identity", aes(fill = Contact)) + 
    facet_grid(~ Direction) + 
    labs(list(title = "Monthly Call Summary", x = "Month", y = "Total Call duration in Minutes")) + 
    geom_hline(data = df2, aes(yintercept = Y)) 

enter image description here

Daten (nach dem Entfernen der ersten Spalte)

structure(list(Direction = structure(c(1L, 1L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 
2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("In", 
"Out"), class = "factor"), Contact = c("D28", "D10", "D18", "D3", 
"D10", "D18", "D3", "D18", "D10", "D18", "D21", "D27", "D13", 
"D3", "D10", "D3", "D21", "D22", "D23", "D17", "D13", "D15", 
"D18", "D21", "D2", "D8", "D1", "D15", "D23", "D23", "D18", "D11", 
"D16", "D21", "D24", "D3", "D25", "D15", "D10", "D9", "D22", 
"D19", "D10", "D3", "D8", "D12", "D13", "D15", "D17", "D19", 
"D19", "D20", "D4", "D5", "D6", "D7", "D11", "D13", "D14", "D15", 
"D17", "D19", "D20", "D21", "D22", "D22", "D26", "D27", "DNA" 
), Bill = structure(c(2L, 3L, 3L, 3L, 2L, 1L, 2L, 3L, 1L, 2L, 
2L, 1L, 2L, 1L, 2L, 2L, 3L, 3L, 2L, 3L, 2L, 3L, 1L, 1L, 3L, 3L, 
1L, 1L, 1L, 3L, 2L, 1L, 3L, 3L, 3L, 3L, 1L, 2L, 1L, 1L, 3L, 3L, 
3L, 1L, 3L, 3L, 1L, 2L, 3L, 3L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 1L, 
3L, 3L, 1L, 1L, 3L, 1L, 1L, 2L, 1L, 3L, 2L), .Label = c("April", 
"June", "May"), class = "factor"), Amount = c(56.3, 20.6, 16.3, 
16, 15.9, 14.3, 11.2, 10.8, 9.1, 8, 7.4, 6.9, 6.4, 5.3, 5.1, 
5, 4.6, 3.9, 3.7, 3.4, 3, 3, 3, 3, 3, 3, 2.8, 2.4, 2.4, 2.4, 
2.3, 2.3, 2, 2, 2, 1.9, 1.5, 1.4, 1.3, 1.3, 1.2, 1.2, 1.1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), NA. = c(0, 0, 2.45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0.77, 0.75, 0, 0, 0, 0, 0.45, 0.45, 0.45, 0.45, 0, 0, 0, 0, 
0, 0, 0.35, 0, 0.3, 0.3, 0, 0.29, 0, 0, 0.2, 0, 0.18, 0, 0.17, 
0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Direction", 
"Contact", "Bill", "Amount", "NA."), row.names = c(NA, -69L), class = "data.frame") 
+0

Ich brauche eine Möglichkeit, so zu indizieren, dass für jede Kategorie (In und Out) und jeden Monat unterschiedliche Rankings angezeigt werden, so dass ich die Top 3 und andere für jeden Monat und jede Kategorie im Plot anzeigen kann. –

+0

@ Sumedh- Ja, Top 3 für jeden Monat innerhalb jeder Kategorie (Richtung). Überprüft auf meinem Datensatz und erhalte eine Handlung ähnlich der, die du gepostet hast, und nicht die Top 3 für jeden Monat in jeder Kategorie/Richtung. Wird in Kürze meinen gesamten Datensatz laden. –

+0

@ Sumedh- mein Datensatz wurde hinzugefügt. –

0

Okay, also Monat spezifische Variablen erstellen, wie ...

callsummary$June <- NA 

callsummary$June[callsummary$Bill %in% sort(
    callsummary$Duration, 
    decreasing = TRUE)[1:3]] <- callsummary$Bill[ 
     callsummary$Bill %in% sort(
      callsummary$Duration, 
      decreasing = TRUE)[1:3]] 

callsummary$June[!callsummary$Bill %in% callsummary$Bill[sort(
    callsummary$Duration, 
    decreasing = TRUE)[1:3]] <- "Others" 
+0

Wenn ich ord_df an ggplot übergeben, werde ich die Daten aus dem Rest der Zeilen verlieren. Ich suche nach einer Möglichkeit, diese Zeilen im gestapelten Barplot zu zeigen, aber sie sollten unter "Andere" sein. –

+0

Sie suchen nach einer Möglichkeit, eine Rechnung ohne "Top 3" als "Andere" zu bestimmen? callsummary $ Bill [! callsummary $ Bill% in% cellsummary $ Bill [sort (callsummary $ Duration, falling = TRUE) [1: 3]] <- "Andere" – mkearney

+0

dieser Ansatz (Callsummary $ Bill [! Callsummary $ Bill% in % callsummary $ Bill [sort (callsummary $ Duration, fallend = TRUE) [1: 3]] <- "Andere") kennzeichnet die nicht-top 3 Einträge von callsummary als "Andere". Ich möchte dies für jeden Monat tun, ohne es für jeden Monat in verschiedene Datenrahmen aufteilen zu müssen, da ich alle Daten in demselben Datenrahmen haben muss, um den Box-Plot zu generieren. –

Verwandte Themen