2016-07-26 15 views
1

Ich habe einen Datenrahmen mit fünf Spalten und fünf Zeilen. der Datenrahmen sieht wie folgt aus:Gruppierte Bins mit mehreren Y-Achsen

df <- data.frame(
    day=c("m","t","w","t","f"), 
    V1=c(5,10,20,15,20), 
    V2=c(0.1,0.2,0.6,0.5,0.8), 
    V3=c(120,100,110,120,100), 
    V4=c(1,10,6,8,8) 
) 

ich einige Grundstücke tun wollen, so habe ich die ggplot und insbesondere die geom_bar:

ggplot(df, aes(x = day, y = V1, group = 1)) + ylim(0,20)+ geom_bar(stat = "identity") 
ggplot(df, aes(x = day, y = V2, group = 1)) + ylim(0,1)+ geom_bar(stat = "identity") 
ggplot(df, aes(x = day, y = V3, group = 1)) + ylim(50,200)+ geom_bar(stat = "identity") 
ggplot(df, aes(x = day, y = V4, group = 1)) + ylim(0,15)+ geom_bar(stat = "identity") 

Meine Frage ist: Wie kann ich eine gruppierte ggplot tun mit geom_bar mit mehreren Y-Achse? Ich möchte auf der X-Achse den Tag und für jeden Tag möchte ich vier Bins V1,V2,V3,V4 aber mit unterschiedlicher Reichweite und Farbe plotten. Ist das möglich?

EDIT

Ich möchte die y-Achse wie folgt aussehen:

multiple axis

+1

Werfen Sie einen Blick auf das 'ggplot2' Dokumentation Beispiel Wie Daten zum Zeichnen vorzubereiten: http://stackoverflow.com/documentation/r/1334/ggplot2#t=201607261933589547859. – Alex

+0

'ggplot2' unterstützt nicht mehrere y-Achsen, wie Sie es wünschen. Wenn Sie so etwas wollen, wird es sehr kompliziert (http://stackoverflow.com/questions/3099219/plot-with-2-y-axes-one-y-axis-on-the-left-and-another- y-Achse-rechts). – Alex

+0

Lesen Sie die letzte Antwort auf die Frage, die ich oben verlinkt habe. Diese Antwort stammt vom Verfasser des ggplot2-Pakets. – Alex

Antwort

1
require(reshape) 
data.m <- melt(df, id.vars='day') 
ggplot(data.m, aes(day, value)) + 
    geom_bar(aes(fill = variable), position = "dodge", stat="identity") + 
    facet_grid(variable ~ .) 

enter image description here

Sie auch die y-Achse Grenzen ändern können, wenn Sie mögen (hier ist ein example).

Alternativ Sie wie folgt gruppiert haben dazu können:

require(reshape) 
data.m <- melt(df, id.vars='day') 
ggplot(data.m, aes(day, value)) + 
    geom_bar(aes(fill = variable), position = "dodge", stat="identity") 

enter image description here

Für die letztgenannten Beispiele, wenn Sie 2 Y wollen Achsen dann erstellen Sie einfach die Handlung zweimal (einmal mit der linken y-Achse und einmal mit der rechten y-Achse), dann mit dieser Funktion:

double_axis_graph <- function(graf1,graf2){ 
    graf1 <- graf1 
    graf2 <- graf2 
    gtable1 <- ggplot_gtable(ggplot_build(graf1)) 
    gtable2 <- ggplot_gtable(ggplot_build(graf2)) 
    par <- c(subset(gtable1[['layout']], name=='panel', select=t:r)) 
    graf <- gtable_add_grob(gtable1, gtable2[['grobs']][[which(gtable2[['layout']][['name']]=='panel')]], 

          par['t'],par['l'],par['b'],par['r']) 
    ia <- which(gtable2[['layout']][['name']]=='axis-l') 
    ga <- gtable2[['grobs']][[ia]] 
    ax <- ga[['children']][[2]] 
    ax[['widths']] <- rev(ax[['widths']]) 
    ax[['grobs']] <- rev(ax[['grobs']]) 
    ax[['grobs']][[1]][['x']] <- ax[['grobs']][[1]][['x']] - unit(1,'npc') + unit(0.15,'cm') 
    graf <- gtable_add_cols(graf, gtable2[['widths']][gtable2[['layout']][ia, ][['l']]], length(graf[['widths']])-1) 
    graf <- gtable_add_grob(graf, ax, par['t'], length(graf[['widths']])-1, par['b']) 

    return(graf) 
} 

ich glaube, ein Paket oder Bequemlichkeit gibt es auch Funktion, die das gleiche tut.

+0

Vielen Dank für Ihre Antwort und vor allem für die Funktion. –

1

Zuerst habe ich neu gestaltet wie in der Dokumentation in den Link unterhalb der Frage beschrieben. Im Allgemeinen unterstützt ggplot nicht mehrere Y-Achsen. Ich denke, es ist eine philosophische Sache. Aber vielleicht funktioniert Facettierung für dich.

df <- read.table(text = "day V1 V2 V3 V4 
          m 5 0.1 120 1 
          t 10 0.2 100 10 
          w 2 0.6 110 6 
          t 15 0.5 120 8 
          f 20 0.8 100 8", header = TRUE) 

library(reshape2) 
df <- melt(df, id.vars = 'day') 

ggplot(df, aes(x = variable, y = value, fill = variable)) + geom_bar(stat = "identity") + facet_grid(.~day) 

enter image description here

1

Wenn ich richtig verstehe, möchten Sie facets in Ihrem Grundstück enthalten. Sie müssen reshape2 verwenden, um die Daten im richtigen Format zu erhalten. Hier ist ein Beispiel mit Ihren Daten:

df <- data.frame(
    day=c("m","t","w","t","f"), 
    V1=c(5,10,20,15,20), 
    V2=c(0.1,0.2,0.6,0.5,0.8), 
    V3=c(120,100,110,120,100), 
    V4=c(1,10,6,8,8) 
) 

library(reshape2) 

df <- melt(df, "day") 

Dann Grundstück mit und umfassen facet_grid Argument:

ggplot(df, aes(x=day, y=value)) + geom_bar(stat="identity", aes(fill=variable)) + 
    facet_grid(variable ~ .) 

enter image description here

+0

Nicht die Farben vergessen. –

+0

@ Hack-R's Antwort ist näher, was ich meine. Ich fügte ein Bild mit der multiplen Achse hinzu, die ich zeichnen möchte. Obwohl ich nicht sicher bin, wie man das mit Bars macht. –

+0

Bearbeitet, um Farben einzuschließen. Ja, ich sehe Ihr Beispielbild jetzt @ g.f.l – Warner