Eliminar espacio entre los datos trazados y los ejes
Tengo el siguiente marco de datos:
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))
Cuando hago un gráfico de área con:
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()
Obtengo este resultado:
Sin embargo, quiero eliminar el espacio entre el eje y la trama real. Cuando agrego theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))
me sale el siguiente mensaje de error:
Error in theme(panel.grid = element_blank(), panel.margin = unit(-0.8, :
could not find function "unit"
¿Alguna sugerencia sobre cómo resolver este problema?
Actualización: consulte la respuesta de @divibisan para conocer más posibilidades en las últimas versiones deggplot2.
De ?scale_x_continuous
aproximadamente el expand
argumento:
Vector de constantes de expansión de rango que se utiliza para agregar algo de relleno alrededor de los datos, para garantizar que se coloquen a cierta distancia de los ejes. Los valores predeterminados son expandir la escala en un 5% en cada lado para variables continuas y en 0,6 unidades en cada lado para variables discretas.
Por tanto, el problema se resuelve sumando expand = c(0,0)
a scale_x_continuous
y scale_y_continuous
. Esto también elimina la necesidad de agregar el panel.margin
parámetro.
El código:
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())
El resultado:
A partir de ggplot2 version 3
, hay una expand_scale()
función que puede pasar al expand=
argumento que le permite especificar diferentes valores de expansión para cada lado de la escala.
A partir de ggplot2 version 3.3.0
, expand_scale()
ha quedado obsoleto a favor del expansion
cual, por lo demás, funciona de manera idéntica.
También le permite elegir si desea que la expansión sea un tamaño absoluto (use el add=
parámetro) o un porcentaje del tamaño del gráfico (use el mult=
parámetro):
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()
Dado que esta es mi respuesta más votada, pensé en ampliarla para ilustrar mejor la diferencia entre add=
y mult=
. Ambas opciones expanden el área de trazado una cantidad específica fuera de los datos. Usando add
, expande el área en una cantidad absoluta (en las unidades utilizadas para ese eje) mientras mult
expande el área en una proporción específica del tamaño total de ese eje.
En el siguiente ejemplo, expando la parte inferior usando add=10
, que extiende el área de la trama en 10 unidades hasta -10. Amplié la parte superior usando mult=.15
la cual se extiende hasta la parte superior del área de trazado en un 15% del tamaño total de los datos en el eje y. Dado que los datos van de 0 a 100, es decir, 0,15 * 100 = 15 unidades, se extiende hasta 115.
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),
breaks = seq(-10, 115, by=15),
expand = expansion(mult = c(0, .15),
add = c(10, 0))) +
theme_bw()