2017-05-28 5 views
0

bauen Ich versuche, eine Handlung, die die Kalorienzahl für verschiedene Arten von Sandwich durch Sandwich-Shop zeigt. I.e. wie viele Kalorien hat ein Veggie Sandwich bei Subway vs Jimmy Johns usw.Inkrementell einen Barplot in R

Ich mag würde dies als BarPlot visualisieren, dass

  • eine Bar für jedes Kaloriezählimpuls des Sandwiches

  • sichtbar Gruppen Sandwiches nach Typ: Veggie, Roastbeef usw., wo jede Gruppe nach den verschiedenen v aufgeteilt wird befürworten.

Meine Daten sieht wie folgt aus (für Reproduzierbarkeit Edited):

cleaninput <- data.frame ("type" = c("italian", "turkey", "roastbeef", "club", "veggie", "italian", "turkey", "roastbeef", "veggie"), 
"vendor" = c("subway", "subway", "subway", "subway", "subway", "jimmyjohns", "jimmyjohns", "jimmyjohns", "jimmyjohns"), 
"calories" = c(410,280,320,310,230,640,510,540,690)) 

Ich versuche wie so über die Daten zu durchlaufen, wo cleaninput ist mein data.frame:

#set up barplot 
barplot(height = mean(cleaninput[['calories']])) 
#iterate over sandwich types 
for (t in levels(cleaninput[['type']])) 
{ 
    cat(t,"\n") 

    barplot(cleaninput[cleaninput[['type']]==t,][['calories']], add = TRUE) 
} 

Die Idee Zuerst den Barplot aufstellen und dann die Balken für jeden Sandwichtyp iterativ hinzufügen. I understood die Einstellung add, um dies zu tun. Ich habe ähnliche Dinge mit regulären Plots gemacht, indem ich die lines und points Befehle verwendet und ein Beispiel unten reproduziert habe - das möchte ich in einen Barplot übertragen.

enter image description here

aber es funktioniert nicht, da es alle Bars auf der jeweils anderen (vgl Ausgang unten) zu Brei scheint.

Meine Fragen

  • (wie) kann ich dieses Problem beheben? Vorzugsweise würde ich lieber Base R als ggplot verwenden, um dies tragbarer zu machen.

  • Gibt es einen besseren Ansatz als for -loop?

Ich suchte nach gruppiert barplots bei tutorials aber nicht sehen, wie sie sich auf mein Problem übersetzt.

Stromausgang:

ugly R plot

+0

Bitte geben Sie Ihre Daten oder eine Teilmenge davon in einer verwendbaren Form - eine, die wir kopieren und einfügen können, ohne Formatierung vornehmen zu müssen z.B. durch Einfügen der Ausgabe von 'dput (cleaninput)'. Sie könnten stattdessen stattdessen ggplot2 lernen. http://www.sthda.com/english/wiki/ggplot2-barplots-quick-start-guide-r-software-and-data-visualization – Djork

+0

@ R.S. Danke, ich dachte, mein Beispiel wäre kopierbar, aber es ist nicht und ich habe es durch ein korrektes ersetzt. Vielen Dank für die Vorschläge von ggplot, aber wie ich bereits sagte, würde ich gerne in Base arbeiten. – patrick

Antwort

1

Hier ist die Lösung in dem Grundstück wie gewünscht, da dies Ihre Präferenz über ggpltot2 ist.

Der erste Schritt besteht darin, Ihre Daten in einem breiten Format zu erhalten, das im Basisplot für Barplots verwendet wird, z.von reshape2::dcast oder tidyr::spread

library(tidyr) 
library(tidyverse) 
cleaninput_spread <- cleaninput %>% spread(type, calories) %>% remove_rownames %>% column_to_rownames(var="vendor") 
cleaninput_spread 

>   club italian roastbeef turkey veggie 
> jimmyjohns NA  640  540 510 690 
> subway  310  410  320 280 230 
mit

ersetzen NA-Werte mit 0:

cleaninput_spread[is.na(cleaninput_spread)] <- 0 

Stacked BarPlot in der Basis:

barplot(as.matrix(cleaninput_spread), main="Calories per Sandwich, by shop", 
     xlab="Sandwich", ylab="Calories", 
     col=c("darkblue","red"), 
     legend = rownames(cleaninput_spread)) 

enter image description here

+0

Danke Sir, das ist sehr hilfreich! Ich habe eine schnelle Folge, wenn es Ihnen nichts ausmacht: Ich sehe diesen '%>%' Operator von Zeit zu Zeit und verstehe, dass es ein Pipe-ähnlicher Befehl ist; lese ich den Code richtig, dass ich auch alle diese Operationen in einzelnen Befehlen ausführen kann und '%>%' hauptsächlich für Bequemlichkeit und Lesbarkeit? Nochmals vielen Dank für die Handlung! – patrick

+1

Ja, dies entspricht "column_to_rownames (remove_rownames (spread (cleaninput, type, calories)), var =" vendor ")' und kann jede verschachtelte Funktion einzelnen Variablen zuweisen, wenn Sie möchten. – Djork

1

Ist das, was Sie suchen?

type<-c("italian","turkey","roastbeef","club","veggie","italian","turkey","roastbeef","veggie") 
vendor<-c(rep("subway",5),rep("jimmyjohns",4)) 
calories<-c(410,280,320,310,230,640,510,540,690) 
size<-c(rep(6,5),rep(8,4)) 

cleaninput<-data.frame(type,vendor,calories,size) 

#first you calculate the mean by type using by function (base package) 

calor.by.type<-by(cleaninput$calories,INDICES = list(cleaninput$type),FUN = mean) 

#then you plot the result from by function 

barplot(calor.by.type,main="by function") 

enter image description here

+0

Danke für Ihre Hilfe! Leider ist es nicht wirklich das, was ich versuche - ich möchte jeden Typ nach Hersteller aufteilen, dh Subways "Club" gegen Jimmyjohns "Club" usw. Ich habe meiner Frage ein erwartetes Ausgabebeispiel hinzugefügt und versuchte, den Wortlaut zu klären ... Entschuldigung, wenn ich nicht ganz klar war. – patrick