考虑以下图表:
如果图中包含图例,则情况会恶化,因为现在由于图例(无论是在右侧[默认图例位置]还是在其他三个方向之一),我们将有更多的浪费空间。
为了节省空间,我希望将图例移至未填充分面所创建的空间中。
以下方法可以作为节省空间的措施,但是图例锚定在绘图区域的一个角落,可能会在一侧留下很多空间,从而创建一个不平衡的外观:
总之,我想要一个方法:
1. 将分面图的图例移至由空分面创建的空间中。 2. 产生一个相当美观的图形。 3. 可以轻松自动化以处理许多图形。
这对我来说是一个经常使用的情况,我已经决定将其与我的工作解决方案一起发布在这里,以防其他人发现它有用。我还没有在Stack Overflow上看到这种情况的问答。如果有人知道,请留下评论,我很乐意在那里回答,或者将其标记为重复,视情况而定。
library(ggplot2)
p <- ggplot(diamonds,
aes(x = carat, fill = cut)) +
geom_density(position = "stack") +
facet_wrap(~ color)
facet_wrap
函数将一系列分面面板包装成大致矩形的显示,其中有nrow
行和ncol
列。然而,根据数据的不同,实际面板数量通常比nrow * ncol
少几个面板,这在绘图中留下了一大块浪费的空间。如果图中包含图例,则情况会恶化,因为现在由于图例(无论是在右侧[默认图例位置]还是在其他三个方向之一),我们将有更多的浪费空间。
为了节省空间,我希望将图例移至未填充分面所创建的空间中。
以下方法可以作为节省空间的措施,但是图例锚定在绘图区域的一个角落,可能会在一侧留下很多空间,从而创建一个不平衡的外观:
p +
theme(legend.position = c(1, 0),
legend.justification = c(1, 0))
手动调整legend.position
/legend.justification
的值,将图例移至空白区域中心是一个试错过程,并且如果需要处理多个分面图时难以扩展。总之,我想要一个方法:
1. 将分面图的图例移至由空分面创建的空间中。 2. 产生一个相当美观的图形。 3. 可以轻松自动化以处理许多图形。
这对我来说是一个经常使用的情况,我已经决定将其与我的工作解决方案一起发布在这里,以防其他人发现它有用。我还没有在Stack Overflow上看到这种情况的问答。如果有人知道,请留下评论,我很乐意在那里回答,或者将其标记为重复,视情况而定。
!"gtable" %in% class(p)
等)应该通过inherits
来编写:if (!inherits(p, 'gtable'))
。由于你针对不同的对象类执行不同的操作,考虑使用S3方法代替if
语句。 - Konrad Rudolph