2016-12-15 6 views
1

Ich versuche, ein Diagramm zu erstellen, das wie folgt aussieht. Derzeit habe ich Daten mit 4 Headern (Type, Value1, Value2 und der Gesamtwert). Was ich versuche, ist, dass ich die Type-Spalte mit Ausgabe Value1, Value2 und dem Gesamtwert zur gleichen Zeit kategorisieren möchte.ggplot mit drei y-Variablen R

Ich habe einen Code unten, aber es scheint nicht funktioniert! Bitte jeden, der mir in die richtige Richtung zeigen kann.

df <- data.frame(Type = c("a", "b", "c", "d", "e", "f","g","h","i"), 
     Value1 = c(1, 32, 63, 94, 125, 156,187,218,249), 
     Value2 = c(125, 5, 125, 76, 3, 125,3,2,100), 
Total = c(126,37,188,170,128,281,190,220,349)) 

plot <- ggplot(df,aes(x = Type,y=c("Value1","Value2","Total"),fill = EVTYPE))+geom_bar(position="dodge") 

Die Probefläche ist hier:

http://imgur.com/a/mZgTW

+1

Setzen Sie die Daten in ein langes Format (viele Antworten dafür auf SO) und setzen nur eine Sache in y. – Haboryme

+1

möchten Sie auch Position = "stack" – Nate

Antwort

3

Ihre Daten für einen Stapel barchart im falschen Format ist, verwenden Sie die melt Funktion aus dem reshape Paket sein Format in etwas Brauchbares zu ändern.

library(ggplot2) 
library(reshape2) 

df <- data.frame(Type = c("a", "b", "c", "d", "e", "f","g","h","i"), 
      Value1 = c(1, 32, 63, 94, 125, 156,187,218,249), 
      Value2 = c(125, 5, 125, 76, 3, 125,3,2,100), 
      Total = c(126,37,188,170,128,281,190,220,349)) 

df.m <- melt(df,id.vars = "Type") 

plot <- ggplot(df.m, aes(x = Type, y = value,fill=variable)) + 
     geom_bar(stat='identity') 

Dies sollte die Tabelle unten produzieren: enter image description here

2

Ja braucht Ihre Daten neu organisiert werden. So können Sie es manuell machen. Es gibt wahrscheinlich Dutzende verschiedener war dies in R. zu tun

Type = c("a", "b", "c", "d", "e", "f","g","h","i") 
Value1 = c(1, 32, 63, 94, 125, 156,187,218,249) 
Value2 = c(125, 5, 125, 76, 3, 125,3,2,100) 
Total = c(126,37,188,170,128,281,190,220,349) 
Type<-rep(Type,3) 
Values<-c(Value1,Value2,Total) 
Groups<-c(rep("Value1",9),rep("Value2",9),rep("Total",9)) 

df<-data.frame(Type,Values,Groups 

ggplot(df, aes(x=Type,y=Values, fill=Groups)) + geom_bar(stat='identity') 

enter image description here

1

Mit dplyr/tidyr:

library(dplyr) 
library(tidyr) 
df %>% gather(Variable, Value, -Type) %>% ggplot(aes(Type, Value, fill=Variable)) + 
    geom_bar(stat='identity') + scale_fill_manual(values = c('gray', 'skyblue', 'orange')) 

enter image description here

2

Sie könnten mit einer Linie besser dran Plot hier:

library(ggplot2) 
library(reshape2) 

theme_set(theme_bw()) 

f.m = melt(f, id.var="Type") 
f.m$variable = factor(f.m$variable, levels=c("Total", "Value1", "Value2")) 

ggplot(f.m, aes(x=Type, y=value, group=variable, colour=variable)) + 
    geom_line(aes(size=variable)) + 
    geom_point() + 
    scale_color_manual(values=c("black", hcl(c(15,195),100,65))) + 
    scale_size_manual(values=c(1,0.5,0.5)) 

enter image description here

Stacking Total zusammen mit Value1 und Value2 ist irreführend, weil Total die Summe der beiden anderen ist. Wenn Sie ein Balkendiagramm verwenden müssen, gibt Ihnen ein gestapeltes Plot von Value1 und Value2 (mit Total ausgeschlossen) auch die Summe.

library(dplyr) 

ggplot(f.m %>% filter(variable != "Total") %>% 
     mutate(variable = factor(variable, c("Value2", "Value1"))), 
     aes(x=Type, y=value, fill=variable)) + 
    geom_bar(stat="identity") 

enter image description here

Und obwohl ich die Linie Grundstück bevorzugen, ich nehme an, es könnte Umstände geben, wo Sie so etwas wie dies tun wollen würde:

ggplot() + 
    geom_bar(data=f.m %>% filter(variable=="Total"), 
      aes(x=Type, y=value, fill=variable), stat="identity", width=0.8) + 
    geom_bar(data=f.m %>% filter(variable != "Total"), 
      stat="identity", position="dodge", width=0.5, colour="black", 
      aes(x=Type, y=value, fill=variable)) + 
    scale_fill_manual(values=c("grey60", hcl(c(15,195),100,65))) 

enter image description here