【问题标题】:Replace barplot x-axis labels with plots in R?用R中的图替换barplot x轴标签?
【发布时间】:2021-11-07 17:32:06
【问题描述】:

我想做的是创建一个条形图,而不是显示 x 轴标签,我想尝试用单独的图替换标签。希望下面我的示例和尝试的解决方案能够解释这个问题。

首先,我创建一个条形图,然后创建多个单独的图以显示在 x 轴上,如下所示:

library(ggplot)

# create barplot ----------------------------------------------------------

df <- data.frame(vals = c(10, 5, 18),
                 name = c("A", "B", "C"))
bp <- df %>%
  ggplot() +
  geom_bar(aes(x = name, y = vals), stat = "identity") +
  xlab("") +
  theme_bw() +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) 



# create plots to use as x-axis --------------------------------------------

p1 <- ggplot(df, aes(x = vals, y = vals)) + geom_point() + theme_bw() +
  theme(axis.title.x = element_blank(),
        axis.text.x  = element_blank(),
        axis.ticks.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.y  = element_blank(),
        axis.ticks.y = element_blank()) 

p3 <- p2 <- p1

# turn into list of plots
myList <- list(p1, p2, p3)

尝试的解决方案:

我尝试的解决方案是使用 patchwork 包将 x 轴标签替换为单个图,如下所示:

library(patchwork)
# setting positions manually
design <- c(
  area(1, 1, 4, 4),
  area(5,1),
  area(5,3),
  area(5,4)
  
)

bp + myList + plot_layout(design = design)

这看起来像:

但如您所见,这并没有将各个图对齐在相应的条形下方。如果条形图中使用的条形超过 3 个,对齐问题也会更加复杂。

此外,必须使用patchwork::area 函数手动设置位置并不理想。

是否可以创建一个条形图,其中 x 轴显示一堆单独的图,而我不必手动定位它们?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    通过patchwork 实现您想要的结果的一个选项是

    1. 使用geom_blank(aes(x=name)) 创建一个ggplot(以获得与barplot 中相同的轴)
    2. 通过annotation_custom 添加要用作轴标签的图,我使用purrr::map2
    3. 通过theme_void删除所有非数据墨水
    4. 使用patchwork 将“轴图”粘贴到您的条形图上
    library(ggplot2)
    library(patchwork)
    
    width <- .9 # Default width of bars
    p_axis <- ggplot(df) +
      geom_blank(aes(x = name)) +
      purrr::map2(myList, seq_along(myList), ~ annotation_custom(ggplotGrob(.x), xmin = .y - width / 2, xmax = .y + width / 2)) +
      theme_void()
    
    library(patchwork)
    
    bp / p_axis + plot_layout(heights = c(4, 1))
    

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2020-08-05
      • 2020-10-06
      相关资源
      最近更新 更多