R:如何在 ggplot 条形图中的右轴上添加标签?

R: How to add a label on the right axis in a ggplot barchart?

假设我使用以下代码创建一个 ggplot 条形图:

mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

#pelacolset
ggplot(mtcars, 
       #color by which to fill
       aes(fill=gear, 
           #y axis
           y=wt, 
           #x axis
           x=carb)) +
  #title and subtitle
  
  
  #barplot
  geom_bar(position="fill", stat="identity",width=.8)+
  coord_flip()+
  

  #rotate x axis labels 90 degrees
  theme(axis.text.x = element_text(angle=90),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank())

情节是这样的:

现在我想使用列carb_labelright 在条形图的右侧添加数据。它应该是这样的:

如何做到这一点?

我发现使用 geom_text(您需要一个数据框)或 annotate(geom = "text",...) 进行注释最容易。使用注释通常更安全,因为 geom_text 喜欢为每一行创建一个标签(当您使用精心准备的数据框进行注释时,这很好)。

library(tidyverse)
mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

ggplot(mtcars) +
  # use geom_col, a convenience wrapper for geom_bar(stat = "identity")
  geom_col(aes(fill=gear, y=wt, x=carb), 
           position="fill", width=.8) +
  # you have to turn clipping off
  coord_flip(clip = "off") +
  annotate(geom = "text", x = unique(mtcars$carb),
           label = unique(mtcars$carb_labelright),
           y = 1, hjust = 0) +
  # you need to increase the legend's margin and make it "transparent"
  # otherwise you will cover some labels. 
  theme(legend.margin = margin(l = 1, unit = "inch"),
        legend.background = element_blank())

reprex package (v2.0.1)

于 2021-10-26 创建

我也 运行 解决了离散轴不支持二级刻度的问题(参见相关 issue on the ggplot2 repo). I solved it by writing a manual guide 我自己确实允许我制作具有离散刻度的二级轴。在下面的代码中,我们使用ggh4x::guide_axis_manual() 结合 rlang/purrr lambda 函数来格式化标签。(免责声明:我是 ggh4x 的作者)。

library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.1.1

mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

p <- ggplot(mtcars, 
       aes(fill = gear, y = carb, x = wt)) +
  geom_col(position="fill", width=.8)

p + guides(
  y.sec = ggh4x::guide_axis_manual(
    labels = ~ paste0("label_right_", .x)
  )
)

或者,您也可以直接将标签作为字符向量给出。

p + guides(
  y.sec = ggh4x::guide_axis_manual(
    labels = sort(unique(mtcars$carb_labelright))
  )
)

reprex package (v2.0.1)

于 2021-10-26 创建