Eliminar espacio entre los datos trazados y los ejes

Resuelto Jaap asked hace 54 años • 3 respuestas

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:

ingrese la descripción de la imagen aquí

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?

Jaap avatar Jan 01 '70 08:01 Jaap
Aceptado

Actualización: consulte la respuesta de @divibisan para conocer más posibilidades en las últimas versiones deggplot2.


De ?scale_x_continuousaproximadamente el expandargumento:

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_continuousy scale_y_continuous. Esto también elimina la necesidad de agregar el panel.marginpará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: gráfico de área de parcela sin espacios

Jaap avatar Apr 08 '2014 18:04 Jaap

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

ingrese la descripción de la imagen aquí


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 multexpande 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=.15la 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()

ingrese la descripción de la imagen aquí

divibisan avatar Sep 13 '2018 17:09 divibisan