2017-09-14 7 views
4

Ich möchte einen Rand um die Außenseite meines facettierten Grundstücks haben, aber nicht die Linien, die die Platten innerhalb des Grundstücks trennen. Das Problem besteht darin, dass panel.border einen Rahmen um jedes Panel in der Facette zieht, ohne dass eine Option für den gesamten Bereich vorhanden ist. Alternativ können Sie die inneren Trennlinien auf "weiß" setzen, aber die äußere Begrenzung "schwarz" halten.ggplot2 Außenrand bei der Verwendung von Facette

Hier ist mein Code:

mtcars 
mtcars$manufacturer=rownames(mtcars) 
ggplot(mtcars, aes(x=manufacturer, y=mpg,fill=factor(gear,levels=c("3","4","5"))))+ 
    geom_bar(stat="identity",position="dodge",colour="black")+ 
    facet_grid(~cyl,scales = "free_x",space = "free_x",) + 
    theme(axis.text.x = element_text(angle = 45,size=12,colour="Black",vjust=1,hjust=1), 
    strip.background = element_blank(), 
    strip.placement = "inside", 
    strip.text = element_text(size=15), 
    legend.position=c(0.9,0.8), 
    legend.title=element_blank(), 
    legend.text=element_text(size=15), 
    panel.spacing = unit(0.2, "lines"), 
    panel.background=element_rect(fill="white"), 
    panel.border=element_rect(colour="black",size=1), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank()) 

Ergebnis: Faceted Grundstück mit Innen Grenzen

enter image description here

Gewünschte Ausgabe (in Farbe bearbeitet): Faceted Grundstück ohne Innen Linien

enter image description here

Mein eigentlichen Daten Grundstück, das ich die inneren Linien aus sieht wie folgt entfernen mag:

Actual data plot with inside borders needing to be removed

+0

Ich bin nicht sicher, wie nah dieses Beispiel zu Ihrem echten ist Anwendungsfall, aber was gewinnen Sie von den Facetten, wenn Sie die Innenlinien entfernen? Sind es die Etiketten oben? Oder der kleine Abstand zwischen den Zylindergruppen? – aosmith

+0

@aosmith Tut mir leid, ich habe das Beispiel zur Vereinfachung der Dinge, aber meine tatsächlichen Daten sieht aus wie die Bearbeitung, die ich gerade gemacht habe. Das Problem mit den internen Linien ist, dass sie Unterteilungen in einem kontinuierlicheren Zeitreihendatensatz bereitstellen (dh sie betonen eine Unterteilung nach "Jahreszeit", die ich nicht so klar definieren möchte). Wenn ich panel.spacing auf 0 setze, sind die internen Linien dicker als die äußeren Linien, weil sie den Facettenrand zweimal zeichnen - einmal für den rechten Rand der linken Facette und einmal für den linken Rand der mittleren Facette und so weiter auf. – Guidofish

+0

Wie wäre es, Facettierungen zu vermeiden und Etiketten für "Wet" und "Dry" innerhalb der Handlung hinzuzufügen? – aosmith

Antwort

2

Zwei Optionen für die Prüfung, die beide unter Verwendung einer sekundären Achse die Plattengrenze auf der rechten Seite zu simulieren. Verwenden Sie Option 2, wenn Sie die Konturen des Facettenfelds auch oben entfernen möchten.

Option 1:

ggplot(df, 
     aes(x = Month, y = Abundance, fill = Type)) + 
    geom_col(position = "dodge", colour = "black") + 
    scale_y_continuous(labels = function(x){paste(x, "-")}, # simulate tick marks for left axis 
        sec.axis = dup_axis(breaks = 0)) +  # add right axis 
    scale_fill_grey() + 
    facet_grid(~Season, scales = "free_x", space = "free_x") + 
    theme_classic() + 
    theme(axis.title.y.right = element_blank(),    # hide right axis title 
     axis.text.y.right = element_blank(),     # hide right axis labels 
     axis.ticks.y = element_blank(),      # hide left/right axis ticks 
     axis.text.y = element_text(margin = margin(r = 0)), # move left axis labels closer to axis 
     panel.spacing = unit(0, "mm"),      # remove spacing between facets 
     strip.background = element_rect(size = 0.5))   # match default line size of theme_classic 

option 1

(. Ich die Legende in die Standardposition verlasse, da es hier nicht kritisch ist)

Option 2 ist eine Modifikation von Option 1, wobei die Facettenkontur entfernt wurde & eine horizontale Linie hinzugefügt, um den oberen Rand zu simulieren. Y-Achse Grenzen gesetzt sind explizit die Höhe dieser Grenze entsprechen:

y.upper.limit <- diff(range(df$Abundance)) * 0.05 + max(df$Abundance) 
y.lower.limit <- 0 - diff(range(df$Abundance)) * 0.05 

ggplot(df, 
     aes(x = Month, y = Abundance, fill = Type)) + 
    geom_col(position = "dodge", colour = "black") + 
    geom_hline(yintercept = y.upper.limit) + 
    scale_y_continuous(labels = function(x){paste(x, "-")}, # 
        sec.axis = dup_axis(breaks = 0),  # 
        expand = c(0, 0)) +      # no expansion from explicitly set range 
    scale_fill_grey() + 
    facet_grid(~Season, scales = "free_x", space = "free_x") + 
    coord_cartesian(ylim = c(y.lower.limit, y.upper.limit)) + # set explicit range 
    theme_classic() + 
    theme(axis.title.y.right = element_blank(),    # 
     axis.text.y.right = element_blank(),     # 
     axis.ticks.y = element_blank(),      # 
     axis.text.y = element_text(margin = margin(r = 0)), # 
     panel.spacing = unit(0, "mm"),      # 
     strip.background = element_blank())     # hide facet outline 

option 2

Beispieldaten verwendet:

set.seed(10) 
df <- data.frame(
    Month = rep(c("Jun 14", "Aug 14", "Oct 14", "Dec 14", "Apr 15", "Jun 15"), 
      each = 3), 
    Type = rep(c("Mangrove", "Mudflat", "Fringe"), 6), 
    Season = rep(c("Dry1", rep("Wet1", 3), rep("Dry2", 2)), each = 3), 
    Abundance = sample(50:600, 18) 
) 

df <- df %>% 
    mutate(Month = factor(Month, levels = c("Jun 14", "Aug 14", "Oct 14", 
              "Dec 14", "Apr 15", "Jun 15")), 
     Season = factor(Season, levels = c("Dry1", "Wet1", "Dry2"))) 

(Für das Protokoll, ich glaube nicht, facet_grid/facet_wrap waren für solche Anwendungsfälle gedacht ...)

+0

Danke @ Z.Lin Ich hatte über die Verwendung einer sekundären Y-Achse nachgedacht, konnte sie aber nicht zum Laufen bringen. Prost nochmal. – Guidofish

Verwandte Themen