如何在ggplot中仅扩展一个方向的条形图比例尺,而无需手动设置限制。

18
目标是在不切断任何百分比标签的情况下消除刻度线和条形底部之间的间隙。我正在使用R的ggplot2运行数十个条形图,并尝试遵循我们的组织样式指南,该指南是手动使用Excel为每个图表开发的。不同图表中最长的条形长度不同,并且随着源数据的更改可能会发生变化,因此我不想手动设置限制。[也许在这里有一个解决方法:是否有一种根据输入自动调整限制的方法?] 我已经咨询了以下内容:在ggplot2中删除负绘图区域 如何在ggplot2中移除轴和区域图之间的空白? 强制在ggplot2(R)中从0开始

http://docs.ggplot2.org/dev/vignettes/themes.html

以下代码生成了一个几乎可以工作的图表。为了公共目的,我使用 MASS 包中的“quine”数据集。首先,我按年龄分组找到女性的百分比。然后,我按女性百分比对年龄组进行排序。
require(MASS)
attach(quine)
p.SexAge <- prop.table(table(Sex, Age), 2)
perc.SexAge <- round(p.SexAge * 100)

perc.SexAge.flattened <- as.data.frame(perc.SexAge)
perc.SexAge.flattened.F <- subset(perc.SexAge.flattened, Sex == "F")
require(ggplot2)

ggplot(data=perc.SexAge.flattened.F, aes(x=reorder(Age, -Freq), y=Freq))  + 
geom_bar(stat="identity", fill = "#00ABE1") +
scale_x_discrete(expand = c(0, 0)) +
scale_y_continuous(expand = c(0,6)) +
ggtitle("Percent Female By Age") +
ylab("Percent Female") +
xlab("Age Group\n") +
#theme_classic() +  
theme(plot.margin = unit(c(0,0,0,0), "in")) +
coord_flip() +
geom_text(aes(label = Freq), vjust = 0.4, hjust = - 0.4, size = 3.5)

default theme

当取消注释theme_classic()以创建空白以满足我们的样式指南时,很明显垂直轴刻度线和条形底部之间存在过多的空间。如果有更多的条形图(未显示),这个问题会变得更加严重。

class theme

如果我将 scale_y_continuous(expand = c(0,6)) 改为 scale_y_continuous(expand = c(0,0)),最长的条形图标签会被截断,违反了组织风格指南。

chopped off label

2个回答

27
在ggplot2版本3.3.3中,scale_y_continuous(expand = expansion(mult = c(0, .1)))可以实现此功能。这将仅通过10%(.1)扩展您的Y轴右端。您还可以按固定量扩展该端点:例如,scale_y_continuous(expand = expansion(add = c(0, 5)))将其扩展5个空间单位。

20
注意:随着即将发布的ggplot2 2.3.0版本,expand的实现方式将发生改变,并且两端都将提供灵活性。以下答案仍将有效,但不再必要。请参见?expand_scale expand并不会是您的朋友,因为这两个参数都是乘法和加法扩展常数,适用于两侧。 因此,c(0,6)将始终在每一侧添加6个单位。 连续数据的默认值为c(0.05,0),这是两端范围增加了5%。
我们可以预先计算所需的范围。 左边界应始终设置为0,右边界设置为max + 6。(如果绘图之间的范围差异非常大,也可以使用乘法因子。)
lim <- c(0, max(perc.SexAge.flattened.F$Freq) + 6)
#lim <- c(0, max(perc.SexAge.flattened.F$Freq) * 1.1) # 10% increase

ggplot(data=perc.SexAge.flattened.F, aes(x=reorder(Age, -Freq), y=Freq))  + 
  geom_bar(stat="identity", fill = "#00ABE1") +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0), limits = lim) +               #This changed!
  ggtitle("Percent Female By Age") +
  ylab("Percent Female") +
  xlab("Age Group\n") +
  theme_classic() +  
  theme(plot.margin = unit(c(0,0,0,0), "in")) +
  coord_flip() +
  geom_text(aes(label = Freq), vjust = 0.4, hjust = - 0.4, size = 3.5)

输入图像描述

p.s. 请勿使用attach,尤其是用于其他人加载到其环境中的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接