Wie entferne ich den Abstand zwischen Achse und Flächendiagramm in ggplot2?

113

Ich habe folgenden Datenrahmen:

uniq <- structure(list(year = c(1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 1986L, 1987L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L), uniq.loc = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("u.1", "u.2", "u.3"), class = "factor"), uniq.n = c(1, 1, 1, 2, 5, 4, 2, 16, 16, 10, 15, 14, 8, 12, 20, 11, 17, 30, 17, 21, 22, 19, 34, 44, 56, 11, 0, 0, 3, 3, 7, 17, 12, 21, 18, 10, 12, 9, 7, 11, 25, 14, 11, 17, 12, 24, 59, 17, 36, 50, 59, 12, 0, 0, 0, 1, 4, 6, 3, 3, 9, 3, 4, 2, 5, 2, 12, 6, 8, 8, 3, 2, 9, 5, 20, 7, 10, 8), uniq.p = c(100, 100, 25, 33.3, 31.2, 14.8, 11.8, 40, 37.2, 43.5, 48.4, 56, 40, 48, 35.1, 35.5, 47.2, 54.5, 53.1, 44.7, 24.4, 46.3, 37.8, 43.6, 44.8, 35.5, 0, 0, 75, 50, 43.8, 63, 70.6, 52.5, 41.9, 43.5, 38.7, 36, 35, 44, 43.9, 45.2, 30.6, 30.9, 37.5, 51.1, 65.6, 41.5, 40, 49.5, 47.2, 38.7, 0, 0, 0, 16.7, 25, 22.2, 17.6, 7.5, 20.9, 13, 12.9, 8, 25, 8, 21.1, 19.4, 22.2, 14.5, 9.4, 4.3, 10, 12.2, 22.2, 6.9, 8, 25.8)), .Names = c("year", "uniq.loc", "uniq.n", "uniq.p"), class = "data.frame", row.names = c(NA, -78L))

Wenn ich ein Flächenplot mache mit:

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits=c(1986,2014)) +
  scale_y_continuous(limits=c(0,101)) +
  theme_bw()

Ich bekomme dieses Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Ich möchte jedoch den Abstand zwischen der Achse und dem tatsächlichen Diagramm entfernen. Wenn ich hinzufüge, theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))erhalte ich die folgende Fehlermeldung:

Error in theme(panel.grid = element_blank(), panel.margin = unit(-0.8,  : 
  could not find function "unit"

Irgendwelche Vorschläge zur Lösung dieses Problems?

Jaap
quelle
3
Ich denke, Sie mussten das Grid-Paket explizit fürunit
Tyler Rinker
@ TylerRinker Danke! Ich bekomme keine Fehlermeldung mehr. Ich habe das Problem bereits auf andere Weise gelöst, aber dies ist eine schöne Erinnerung für die Zukunft, wenn ich Margen festlegen möchte.
Jaap
3
Dies wird manchmal als enges Layout bezeichnet. Erwähnen Sie dies hier, damit Suchmaschinen es aufgreifen können.
anonym

Antworten:

191

Update: Sehen @ divibisan Antwort für weitere Möglichkeiten in den neuesten Versionen von.


Aus ?scale_x_continuousdem expandArgument:

Vektor der Bereichserweiterungskonstanten, mit denen die Daten aufgefüllt werden, um sicherzustellen, dass sie in einiger Entfernung von den Achsen platziert sind. Standardmäßig wird die Skala für kontinuierliche Variablen auf jeder Seite um 5% und für diskrete Variablen um 0,6 Einheiten auf jeder Seite erweitert.

Das Problem wird somit durch Hinzufügen expand = c(0,0)zu scale_x_continuousund gelöstscale_y_continuous . Dadurch entfällt auch das Hinzufügen des panel.marginParameters.

Der Code:

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits = c(1986,2014), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,101), expand = c(0, 0)) +
  theme_bw() +
  theme(panel.grid = element_blank(),
        panel.border = element_blank())

Das Ergebnis: Plot-Flächendiagramm ohne Lücken

Jaap
quelle
41

Ab ggplot2 version 3gibt es eine expand_scale()Funktion, die Sie an die übergeben könnenexpand= Argument übergeben können, mit der Sie unterschiedliche Erweiterungswerte für jede Seite der Skala angeben können.

Ab ggplot2 version 3.3.0wurde expand_scale()zugunsten von abgelehntexpansion die ansonsten identisch funktioniert.

Außerdem können Sie auswählen, ob die Erweiterung eine absolute Größe (verwenden Sie den add=Parameter) oder einen Prozentsatz der Größe des Diagramms (verwenden Sie den mult=Parameter) haben soll:

ggplot(data = uniq) + 
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +
  scale_x_continuous(limits = c(1986,2014), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,101), expand = expansion(mult = c(0, .1))) +
  theme_bw()

Geben Sie hier die Bildbeschreibung ein

Divibisan
quelle
Kurzer Hinweis: expand_scale()wurde geändert, expansion()funktioniert aber in diesem Fall identisch.
Molx
1
@ Molx Danke, ich habe die Antwort aktualisiert!
Divibisan
14

Eine andere Option, die identische Ergebnisse liefert, ist die Verwendung coord_cartesianvon kontinuierlichen Positionsskalen (x & y) anstelle von:

ggplot(data = uniq) +  
  geom_area(aes(x = year, y = uniq.p, fill = uniq.loc), stat = "identity", position = "stack") +  
  coord_cartesian(xlim = c(1986,2014), ylim = c(0,101))+
  theme_bw() + theme(panel.grid=element_blank(), panel.border=element_blank())
mpalanco
quelle
2
Schöne Alternative, +1. Sie benötigen die scales_x/y_continuousTeile jedoch weiterhin, wenn Sie die Unterbrechungen usw. Angeben möchten.
Jaap
oder, noch einfacher, setzen Sie expand = FALSEein, coord_cartesianwie in @Marcus Kommentar in dieser Frage vorgeschlagen
Tjebo
@Tjebo Die Ausgabe ist etwas anders, aber tatsächlich liegt sie wahrscheinlich näher am erwarteten Ergebnis des OP. Ich werde es später zu meiner Antwort hinzufügen. Danke dir.
mpalanco