如何在ggplot2中并排条形图上居中标签

Posted

技术标签:

【中文标题】如何在ggplot2中并排条形图上居中标签【英文标题】:How to center labels over side-by-side bar chart in ggplot2 【发布时间】:2022-01-08 18:27:31 【问题描述】:

我在 ggplot 工作。我创建了一个条形图,但条形图上的标签不在条形图的中心(见图)。

如何在此图中将每个条形的标签居中于其各自的条形上?

代码如下:

df<- structure(list(Cycle = c(1980, 1982, 1984, 1986, 1988, 1990, 
                         1992, 1994, 1996, 1998, 2000, 2002, 2004, 2006, 2008, 2010, 2012, 
                         2014, 2016, 1980, 1982, 1984, 1986, 1988, 1990, 1992, 1994, 1996, 
                         1998, 2000, 2002, 2004, 2006, 2008, 2010, 2012, 2014, 2016), 
               Donor_Location = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                            1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
                                            2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                            2L), .Label = c("In District", "Out of District"), class = "factor"), 
               Count_Percentage_Mean = c(0.167598290871218, 0.124829496296588, 
                                         0.0940731004562636, 0.125521769946444, 0.134545184854301, 
                                         0.221904402021545, 0.241031685849158, 0.284978425863672, 
                                         0.280387277343076, 0.269095218446438, 0.273131304975636, 
                                         0.288912758780087, 0.297134465175358, 0.296786491472909, 
                                         0.292365465524159, 0.303877491711499, 0.249983664094922, 
                                         0.258636305966848, 0.239182241578899, 0.159250631842859, 
                                         0.161311478778858, 0.157209833306125, 0.161853462566676, 
                                         0.174277618030726, 0.251786815739142, 0.318324841334214, 
                                         0.312697665544327, 0.347430615609066, 0.346833684171301, 
                                         0.374139881841685, 0.422610276126137, 0.432433986875512, 
                                         0.424992976111316, 0.429557833404775, 0.443001597806887, 
                                         0.462424440669885, 0.45460402775165, 0.492540191333363)), row.names = c(NA, 
                                                                                                                 -38L), class = "data.frame")


ggplot(df, aes(x = Cycle , y = Count_Percentage_Mean, fill = Donor_Location)) +
  geom_bar(stat = "identity", position = 'dodge') +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  geom_text(aes(label=paste(round(Count_Percentage_Mean*100,0), "%", sep = "")), position=position_dodge(width=0.9), vjust=-0.5)

谢谢!

【问题讨论】:

查看question 的第二个答案:“position_dodge() 语句采用宽度参数。确保文本在条的末端居中(即,条和文本相同),为 geom_bar 和 geom_text 中的 position_dodge() 语句提供相同的宽度参数。" 【参考方案1】:

尝试为geom_bargeom_text 调整position_dodge(width = 2.1)

library(ggplot2)
ggplot(df, aes(x = Cycle , y = Count_Percentage_Mean, fill = Donor_Location)) +
  geom_bar(stat = "identity", position = position_dodge(width = 2.01)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  geom_text(aes(label = paste(round(Count_Percentage_Mean * 100, 0), "%", sep = "")), 
            position = position_dodge(width = 2.01), vjust = -0.5,
            size = 2)+
  theme(legend.position = "bottom")

由reprex package (v2.0.1) 于 2021-12-02 创建

【讨论】:

太棒了!谢谢您的帮助!这个解决方案也非常有效!【参考方案2】:

嗯。不幸的是,我不能告诉你这个问题的原因是什么。另外,我不知道 ggplot2 的任何更新或......可能我错过了一些基本的东西(也许我需要再喝一杯咖啡)。反正。我查看了layer_data,您的文本标签仅被条形宽度的一半避开。因此,您可以通过将宽度加倍来达到您想要的结果,即在geom_text 中使用position = position_dodge(width = 1.8)

library(ggplot2)

ggplot(df, aes(x = Cycle, y = Count_Percentage_Mean, fill = Donor_Location)) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  geom_text(aes(label = scales::percent(Count_Percentage_Mean, accuracy = 1)), position = position_dodge(width = 1.8), vjust = -0.5)

【讨论】:

太棒了!谢谢您的帮助!这有效!

以上是关于如何在ggplot2中并排条形图上居中标签的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签

R语言ggplot2可视化:ggplot2可视化水平堆叠条形图并且在每个堆叠条形图的内部居中添加百分比文本标签信息

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签

如何在 ggplot2 中的 position_dodge 中将单个条形位置与多个条形居中

R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战

在ggplot2中手动更改复杂堆叠条形图上y轴项目的顺序