Comment supprimer l'espace entre l'axe et le graphique de la zone dans ggplot2?


113

J'ai le dataframe suivant:

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))

Quand je fais un graphique de surface avec:

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()

J'obtiens ce résultat:

entrez la description de l'image ici

Cependant, je souhaite supprimer l'espace entre l'axe et le tracé réel. Lorsque j'ajoute, theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))j'obtiens le message d'erreur suivant:

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

Des suggestions sur la façon de résoudre ce problème?


3
Je pense que vous deviez charger explicitement le paquet de grille pourunit
Tyler Rinker

@TylerRinker Merci! Je ne reçois plus de message d'erreur. J'ai déjà résolu le problème d'une autre manière, mais c'est un joli rappel pour l'avenir lorsque je veux définir des marges.
Jaap

3
Ceci est parfois appelé une mise en page serrée. Mentionner ceci ici pour que les moteurs de recherche puissent le récupérer.
anonyme le

Réponses:


192

Mettre à jour: voir la réponse de @ divibisan pour d'autres possibilités dans les dernières versions de.


À ?scale_x_continuouspropos de l' expandargument:

Vecteur de constantes d'expansion de plage utilisé pour ajouter un peu de remplissage autour des données, afin de s'assurer qu'elles sont placées à une certaine distance des axes. Les valeurs par défaut consistent à élargir l'échelle de 5% de chaque côté pour les variables continues et de 0,6 unité de chaque côté pour les variables discrètes.

Le problème est donc résolu en ajoutant expand = c(0,0)à scale_x_continuouset scale_y_continuous. Cela supprime également la nécessité d'ajouter le panel.marginparamètre.

Le 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())

Le résultat: tracer un graphique en aires sans espaces


41

À partir de ggplot2 version 3, il existe une expand_scale()fonction que vous pouvez passer à l' expand=argument qui vous permet de spécifier différentes valeurs d'expansion pour chaque côté de l'échelle.

Depuis ggplot2 version 3.3.0, expand_scale()a été déconseillée au profit deexpansion qui fonctionne autrement de manière identique.

Il vous permet également de choisir si vous souhaitez que l'expansion soit une taille absolue (utilisez le add=paramètre) ou un pourcentage de la taille du tracé (utilisez le mult=paramètre):

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()

entrez la description de l'image ici


Note rapide: expand_scale()a changé en expansion()mais fonctionne de manière identique dans ce cas.
Molx

1
@Molx Merci, j'ai mis à jour la réponse!
divibisan le

14

Une autre option produisant des résultats identiques consiste à utiliser à la coord_cartesianplace des échelles de position continues (x & y):

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())

2
Belle alternative, +1. Cependant, vous aurez toujours besoin des scales_x/y_continuouspièces si vous souhaitez spécifier les ruptures, etc.
Jaap

ou, encore plus facile, mis expand = FALSEen coord_cartesiancomme suggéré dans @Marcus commentaire dans cette question
Tjebo

@Tjebo Le résultat est légèrement différent mais en fait il est probablement plus proche du résultat attendu par le PO. Je l'ajouterai plus tard à ma réponse. Je vous remercie.
mpalanco
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.