首页 > 解决方案 > R ggplot 标签在非常小的值上被截断

问题描述

我有一个通过循环生成的图表,因此解决方案必须是动态的,而不是一次性的。

基本上一切都很好,直到有一个极端的数据集。在这种情况下,geom_col 的前两个柱是 ~16k 和 ~6k,而第三个柱只有 2。因为它刚好高于 0,所以数字“2”被截断。作为动态生成的图表,我不能使用位置将其移动到条形上方,否则较高的数字会被截断。 在此处输入图像描述

ggplot(gndr_cnt_tbl, aes(Var1, Freq, fill=Var1)) +
  geom_col() +
  geom_text(aes(label=Freq), position=position_stack(0.5), size = 5) + theme(legend.position = "none", axis.text=element_text(size=15), axis.title=element_text(size=12))+ggtitle("Gender Breakdown")+
  theme(plot.title = element_text(size=15))+xlab("Gender")+   scale_y_continuous(expand = c(0, 0), limits = c(0, NA))

任何帮助都会很棒:)

标签: rggplot2

解决方案


这里有两种方法。

  1. 如果标签太低,请移动标签的 y 值。在这里,pmax(1000, Freq)将文本放置在 Freq 或 1000 的较大值处,为文本位置设置下限。

代码:

ggplot(gndr_cnt_tbl, aes(Var1, Freq, fill=Var1)) +
  geom_col() +
  geom_text(aes(label=Freq, y = pmax(1000, Freq)),   # HERE
            position=position_stack(0.5), size = 5) + 
  theme(legend.position = "none", axis.text=element_text(size=15), 
        axis.title=element_text(size=12))+ggtitle("Gender Breakdown")+
  theme(plot.title = element_text(size=15))+xlab("Gender")+   
  scale_y_continuous(expand = c(0, 0), limits = c(0, NA)) 

在此处输入图像描述

  1. 添加 + coord_cartesian(clip = "off")以便绘图区域之外的文本和绘图元素不会被剪掉。如果要防止值与轴标签重叠,还可以使用vjust = 0.

在此处输入图像描述

我使用的样本数据:

gndr_cnt_tbl = data.frame(
  Var1 = c("Female", "Male", "Other"),
  Freq = c(10000, 5000, 5)
)

推荐阅读