R 如何在没有手动限制的情况下,在一边而不是另一边扩展绘图栏比例

R 如何在没有手动限制的情况下,在一边而不是另一边扩展绘图栏比例,r,ggplot2,geom-bar,R,Ggplot2,Geom Bar,目标是消除刻度线和条形底部之间的空间,而不切断条形另一端以外的任何百分比标签 我使用R的ggplot2运行了几十个条形图,并试图遵循我们的组织风格指南,该指南是为每个图形使用Excel手动开发的。最大长度条在不同的图形中具有不同的长度,并且可能随着源数据的更改而更改,因此我不想手动设置限制。[这里可能有一个解决方法:是否有一种根据输入自动调整限制的方法?] 我已经咨询过: 下面的代码生成了一个几乎可以工作的图形。出于公共目的,我正在使用MASS包中的“quine”数据集。首先,我按年龄分

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

我使用R的ggplot2运行了几十个条形图,并试图遵循我们的组织风格指南,该指南是为每个图形使用Excel手动开发的。最大长度条在不同的图形中具有不同的长度,并且可能随着源数据的更改而更改,因此我不想手动设置限制。[这里可能有一个解决方法:是否有一种根据输入自动调整限制的方法?]

我已经咨询过:

下面的代码生成了一个几乎可以工作的图形。出于公共目的,我正在使用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)
require(质量)
附(奎因)
p、 SexAge注意:
expand
的实施将随着即将发布的
ggplot2
2.3.0版而改变,并且两端都将提供灵活性。下面的答案将继续有效,但不再必要。请参见“扩展比例”

expand
不会是您的朋友,因为这两个参数都是乘法和加法展开常数。所以
c(0,6)
将始终在每侧添加6个单位。连续数据的默认值为
c(0.05,0)
,两端的范围增加5%

我们可以预先计算所需的范围。左侧边界应始终设置为0,右侧边界应设置为max+6。(如果绘图之间的范围变化很大,也可以使用乘法因子。)


lim在ggplot2版本3.3.3中,
scale\u y\u continuous(expand=expansion(mult=c(0.1))
执行此任务。这将仅将Y轴的右端延伸10%(.1)。您还可以按固定的数量扩展该端点:例如,
scale\u y\u continuous(expand=expansion(add=c(0,5))
将其扩展5个空间单位

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)