2017-12-17 6 views
2

Ich versuche, Balkendiagramme auf einer Karte nach diesem Beispiel zu zeichnen: How to plot barchart onto ggplot2 map. Das funktioniert gut, aber im Gegensatz zu dem Beispiel möchte ich die x- und y-Achse hinzufügen. Das Problem ist, dass der y-Bereich der Daten in den Regionen, für die ich die Balkendiagramme erstellen möchte, sehr unterschiedlich ist.Erstellen Sie zwei separate ggplots mit vergleichbarer Y-Achse, aber mit unterschiedlichen y-Limits

Um vergleichbare Graphen zu erzeugen (d. H. Wo die y-Achse eine identische Dimension hat), wende ich dieselben y-Grenzen an alle Graphen an und passe die Pausen für jeden Graph an. Dies ist jedoch keine gute Lösung, da einige der Graphen (p2 in diesem Fall) eine große leere Fläche oberhalb und unterhalb der Balken haben. Um es funktionieren zu lassen, suche ich nach einer Methode, um die Graphen zu beschneiden, um die leeren Bereiche zu entfernen, während gleichzeitig die Dimensionen des Graphen beibehalten werden, so dass die y-Achse verglichen werden kann.

library(dplyr) 
library(ggplot2) 

df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2)) 

df1 <- filter(df, country == "NLD") 
p1 <- ggplot(data = df1) + 
    geom_col(aes(x = type, y = value)) + 
    scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
    theme_bw() 
p1 


df2 <- filter(df, country == "BEL") 
p2 <- ggplot(data = df2) + 
     geom_col(aes(x = type, y = value)) + 
     scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df2$value), max(df2$value), 2)) + 
     theme_bw() 
    p2 

Antwort

1

Haben Sie coord_fixed für jede der Handlung versucht? Wenn Sie die Breite jedes Diagramms gleich steuern können, ist die Höhe der Balken vergleichbar.

library(dplyr) 
library(ggplot2) 
library(gridExtra) 

df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2)) 

df1 <- filter(df, country == "NLD") 
p1 <- ggplot(data = df1) + 
    geom_col(aes(x = type, y = value)) + 
    # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
    theme_bw() 

df2 <- filter(df, country == "BEL") 
p2 <- ggplot(data = df2) + 
    geom_col(aes(x = type, y = value)) + 
    # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df2$value), max(df2$value), 2)) + 
    theme_bw() 

x_range <- length(unique(df$type)) 
y_range1 <- max(df1$value) - min(df1$value) 
y_range2 <- max(df2$value) - min(df2$value) 

g1 <- p1 + coord_fixed(ratio = x_range/y_range1) 
g2 <- p2 + coord_fixed(ratio = x_range/y_range1) 

# example output 
grid.arrange(g1, g2, nrow = 1) 
+0

Dies ist eine große einfache Lösung, die mein Problem für 90% anspricht. Für einige der einzelnen Diagramme habe ich jedoch keine Daten für alle Kategorien auf der x-Achse, und daher führt diese Lösung zu einer Verzerrung der Größe dieser Figuren. Ich begrüße Lösungen, die eine universelle Lösung bieten. –

+0

Nicht sicher, ob dies das ist, was Sie wollen, aber Sie können 'scale_x_discrete (limits = levels (df $ type))' zu p1, p2, ... hinzufügen, um zu erzwingen, dass alle Plots die gleiche 'x-Achse' haben Die Balkenbreite ist über p1, p2, ... gleich. Wenn ein Typ fehlt, wird ein Leerzeichen angezeigt. –

Verwandte Themen