如何在没有手动限制的情况下扩展ggplot条形标尺而不是另一侧

Tom*_*SLC 7 r ggplot2 geom-bar

目标是摆脱刻度线和条形底部之间的空间,而不会切除条形另一端之外的任何百分比标签.

我使用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)
Run Code Online (Sandbox Code Playgroud)

默认主题

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

课堂主题

如果我换scale_y_continuous(expand = c(0,6))scale_y_continuous(expand = c(0,0)),标签会在最长的栏上被砍掉,违反了组织风格指南.

切掉标签

Axe*_*man 11

注意:实施expand将随即将发布的ggplot2版本2.3.0而变化,并且两端都将提供灵活性.以下答案将继续有效,但不再需要.见?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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ps请不要使用attach,尤其是其他人加载到他们的环境中的代码.


use*_*777 6

在 ggplot2 版本 3.3.3 中,可以scale_y_continuous(expand = expansion(mult = c(0, .1)))完成这项工作。这只会将 Y 轴的右端延长 10% (.1)。您还可以按固定量扩展该端:例如, scale_y_continuous(expand = expansion(add = c(0, 5)))将其扩展 5 个空间单位。