删除绘制的数据和轴之间的空间

我有以下数据框:

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

当我用以下方法绘制面积图时:

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

我得到的结果是:

enter image description here

但是,我想删除轴和实际情节之间的空间。当我添加 theme(panel.grid = element_blank(), panel.margin = unit(-0.8, "lines"))时,我得到以下错误消息:

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

对如何解决这个问题有什么建议吗?

134960 次浏览

更新: 请参阅 @ Divibisan 的回答了解 最新版本的更多可能性。


来自 ?scale_x_continuous的关于 expand的论点:

用于添加一些空白的范围扩展常数的向量 数据,以确保它们被放置在远离 默认值是在每一边将比例扩展5% 连续变量,每边0.6个单位的离散 变量。

通过在 scale_x_continuousscale_y_continuous中加入 expand = c(0,0)解决了这个问题。这也消除了添加 panel.margin参数的需要。

密码:

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

结果是: plot area chart with no gaps

产生相同结果的另一种选择是使用 coord_cartesian而不是连续位置刻度(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())

ggplot2 version 3开始,有一个 expand_scale()函数可以传递给 expand=参数,该参数允许您为缩放比例的每一边指定不同的展开值。

至于 ggplot2 version 3.3.0expand_scale()已被弃用,取而代之的是 expansion,否则它们的功能完全相同。

它还允许您选择是否希望展开为绝对大小(使用 add=参数)或图形大小的百分比(使用 mult=参数) :

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

enter image description here


由于这是我最喜欢的答案,我想我应该扩展一下,以更好地说明 add=mult=之间的区别。这两个选项都在数据之外将绘图区域扩展了一个特定的数量。使用 add,将该区域扩展一个绝对量(以该轴使用的单位为单位) ,而 mult将该区域扩展该轴总大小的一个指定比例。

在下面的示例中,我使用 add=10展开底部,它将绘图面积扩展了10个单位,直到 -10。我使用 mult=.15展开顶部,它延伸到绘图区域的顶部,占 y 轴数据总大小的15% 。因为数据是从0.100开始的,所以是0.15 * 100.15单位-所以它扩展到了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()

enter image description here