如何根据箱子高度设置自动标签位置

时间:2018-04-17 14:55:59

标签: r ggplot2 histogram

In a previous question,我问过如果酒吧太小,可以将条形图的标签位置移到酒吧外面。我提供了以下示例:

library(ggplot2)
options(scipen=2)
dataset <- data.frame(Riserva_Riv_Fine_Periodo = 1:10 * 10^6 + 1,
                Anno = 1:10)
ggplot(data = dataset,  
aes(x = Anno, 
    y = Riserva_Riv_Fine_Periodo)) + 
geom_bar(stat = "identity", 
          width=0.8, 
          position="dodge") + 
geom_text(aes( y = Riserva_Riv_Fine_Periodo,
                label = round(Riserva_Riv_Fine_Periodo, 0), 
                angle=90, 
                hjust= ifelse(Riserva_Riv_Fine_Periodo < 3000000, -0.1,  1.2)), 
          col="red", 
          size=4, 
          position = position_dodge(0.9))

我得到了这张图: Histogram

示例的问题在于标签移动的值必须硬编码到图中,ifelse语句用于重新定位标签。有没有办法自动提取要剪切的值?

1 个答案:

答案 0 :(得分:0)

稍微好一点的选择可能是将测试和标签的位置设置在相对于最高条的高度的条的高度上。这样,截止值和标签移位被缩放到绘图的实际垂直范围。例如:

ydiff = max(dataset$Riserva_Riv_Fine_Periodo)

ggplot(dataset, aes(x = Anno, y = Riserva_Riv_Fine_Periodo)) + 
  geom_bar(stat = "identity", width=0.8) + 
  geom_text(aes(label = round(Riserva_Riv_Fine_Periodo, 0), angle=90, 
                y = ifelse(Riserva_Riv_Fine_Periodo < 0.3*ydiff, 
                           Riserva_Riv_Fine_Periodo + 0.1*ydiff,
                           Riserva_Riv_Fine_Periodo - 0.1*ydiff)), 
            col="red", size=4)

enter image description here

你仍然需要调整测试条件下的小数截止值(在这种情况下我使用了0.3),具体取决于渲染绘图的物理大小。但是你可以将代码打包成一个函数,使任何手动调整更容易。

通过确定构成情节的各种凹凸的实际尺寸,并根据这些尺寸设定条件和位置,可能可以实现自动化,但我不知道该怎么做。

正如一篇社论评论一样,在某些酒吧内部和其他地方都有标签的情节可能会混淆大小与酒吧高度的视觉映射。我认为最好找到缩小,缩写,重新编码或以其他方式调整标签的方法,以便它们包含您想要传达的信息,同时能够在条形图中包含所有标签。也许是这样的:

library(scales)

ggplot(dataset, aes(x = Anno, y = Riserva_Riv_Fine_Periodo/1000)) + 
  geom_col(width=0.8, fill="grey30") + 
  geom_text(aes(label = format(Riserva_Riv_Fine_Periodo/1000, big.mark=",", digits=0), 
                y = 0.5*Riserva_Riv_Fine_Periodo/1000), 
            col="white", size=3) +
  scale_y_continuous(label=dollar, expand=c(0,1e2)) +
  theme_classic() +
  labs(y="Riserva (thousands)")

enter image description here

或者可以选择线条而不是条形图:

ggplot(dataset, aes(Anno, Riserva_Riv_Fine_Periodo/1e3)) +
  geom_line(linetype="11", size=0.3, colour="grey50") +
  geom_text(aes(label=format(Riserva_Riv_Fine_Periodo/1e3, big.mark=",", digits=0)), 
            size=3) +
  theme_classic() +
  scale_y_continuous(label=dollar, expand=c(0,1e2)) +
  expand_limits(y=0) +
  labs(y="Riserva (thousands)")

enter image description here