使用 ggarrange 对齐图表

Align diagrams by using ggarrange

如何对齐两条红线 (y = 0)?我把male的剧情改成了scale_y_continuous(breaks = seq(-0.06, 0.02, 0.02)。但它没有用。它仍然没有对齐。所有注释都是为了构建 95% 的置信区间。此外,每个点都代表估计系数。

下面是我的代码。

male <- ggplot() +
      geom_hline(yintercept = 0, color = 'red', lwd = 1) +
      theme_minimal() +
      labs(x = '年資', y = '失業率和年資虛擬變數之係數', title = '男性') +
      theme(text = element_text(family ='黑體-繁 中黑'),
            plot.title = element_text(size = rel(2), face = 'bold', hjust = 0.5),
            axis.title = element_text(size = rel(1.5), face = 'bold',
                                      colour = 'black'),
            axis.text = element_text(size = rel(1.5), face = 'bold',
                                     colour = 'black'),
            panel.grid.major = element_blank(),
            panel.grid.minor = element_blank(),
            panel.background = element_blank()) +
      scale_x_continuous(breaks = seq(0, 14)) +
      annotate('pointrange', x = 0, y = -.0447358, ymin = -.0497855,
               ymax = -.0396861, size = 0.5) +
      annotate('pointrange', x = 1, y = -.0180776, ymin = -.0230804,
               ymax = -.0130748, size = 0.5) +
      annotate('pointrange', x = 2, y = -.016423, ymin = -.0213736,
               ymax = -.0114724, size = 0.5) +
      annotate('pointrange', x = 3, y = -.0129881, ymin = -.0178787,
               ymax = -.0080975, size = 0.5) +
      annotate('pointrange', x = 4, y = -.0103175, ymin = -.015139,
               ymax = -.0054961, size = 0.5) +
      annotate('pointrange', x = 5, y = -.0082522, ymin = -.0130095,
               ymax = -.0034949, size = 0.5) +
      annotate('pointrange', x = 6, y = -.0071008, ymin = -.0118032,
               ymax = -.0023985, size = 0.5) +
      annotate('pointrange', x = 7, y = -.0070145, ymin = -.0116721,
               ymax = -.0023569, size = 0.5) +
      annotate('pointrange', x = 8, y = -.0056933, ymin = -.0103182,
               ymax = -.0010684, size = 0.5) +
      annotate('pointrange', x = 9, y = -.0047233, ymin = -.0093261,
               ymax = -.0001205, size = 0.5) +
      annotate('pointrange', x = 10, y = -.003273, ymin = -.0078732,
               ymax = .0013272, size = 0.5) +
      annotate('pointrange', x = 11, y = .0006229, ymin = -.0040254,
               ymax = .0052711, size = 0.5) +
      annotate('pointrange', x = 12, y = .0037801, ymin = -.0010039,
               ymax = .0085641, size = 0.5) +
      annotate('pointrange', x = 13, y = .0032255, ymin = -.0017867,
               ymax = .0082376, size = 0.5) +
      annotate('pointrange', x = 14, y = .0029918, ymin = -.0026945, ymax = .008678,
               size = 0.5)
    
    female <- ggplot() +
      geom_hline(yintercept = 0, color = 'red', lwd = 1) +
      theme_minimal() +
      labs(x = '年資', y = '失業率和年資虛擬變數之係數', title = '女性') +
      theme(text = element_text(family ='黑體-繁 中黑'),
            plot.title = element_text(size = rel(2), face = 'bold', hjust = 0.5),
            axis.title = element_text(size = rel(1.5), face = 'bold',
                                      colour = 'black'),
            axis.text = element_text(size = rel(1.5), face = 'bold',
                                     colour = 'black'),
            panel.grid.major = element_blank(),
            panel.grid.minor = element_blank(),
            panel.background = element_blank()) +
      scale_x_continuous(breaks = seq(0, 14)) +
      annotate('pointrange', x = 0, y = -.0557045, ymin = -.0594948,
               ymax = -.0519143, size = 0.5) +
      annotate('pointrange', x = 1, y = -.0237874, ymin = -.0275535,
               ymax = -.0200212, size = 0.5) +
      annotate('pointrange', x = 2, y = -.0186763, ymin = -.0224115,
               ymax = -.0149412, size = 0.5) +
      annotate('pointrange', x = 3, y = -.0124177, ymin = -.0161171,
               ymax = -.0087183, size = 0.5) +
      annotate('pointrange', x = 4, y = -.0069645, ymin = -.0106195,
               ymax = -.0033096, size = 0.5) +
      annotate('pointrange', x = 5, y = -.0025661, ymin = -.0061792,
               ymax = .0010469, size = 0.5) +
      annotate('pointrange', x = 6, y = .0009979, ymin = -.0025787,
               ymax = .0045745, size = 0.5) +
      annotate('pointrange', x = 7, y = .0044623, ymin = .000915,
               ymax = .0080096, size = 0.5) +
      annotate('pointrange', x = 8, y = .0070437, ymin = .0035184,
               ymax = .010569, size = 0.5) +
      annotate('pointrange', x = 9, y = .0096577, ymin = .0061462,
               ymax = .0131692, size = 0.5) +
      annotate('pointrange', x = 10, y = .0120116, ymin = .0085022,
               ymax = .0155209, size = 0.5) +
      annotate('pointrange', x = 11, y = .0158938, ymin = .0123547,
               ymax = .0194329, size = 0.5) +
      annotate('pointrange', x = 12, y = .0227411, ymin = .0191273,
               ymax = .0263549, size = 0.5) +
      annotate('pointrange', x = 13, y = .0253041, ymin = .0215681,
               ymax = .0290401, size = 0.5) +
      annotate('pointrange', x = 14, y = .0261749, ymin = .0220729, ymax = .0302769,
               size = 0.5)
    
    ggarrange(male, female)

您可以尝试以下操作:

ggarrange(male, female, align = "hv")

因为目前我的机器上没有安装 ggpubr,所以我无法测试它。但是,如果您以正确的格式排列数据,您的代码会简单得多。因为您有很多数据点,所以使用 annotate 输入每个点是一项非常痛苦的工作。我从你的代码中提取数据并将它们放入数据框中,df 并使用 facet_wrap 分隔两组:

df %>% ggplot(aes(x = x, y = y) )+
  geom_hline(yintercept = 0, color = 'red', lwd = 1) +
  theme_minimal() +
  labs(x = '年資', y = '失業率和年資虛擬變數之係數') +
  theme(text = element_text(family ='黑體-繁 中黑'),
        strip.text = element_text(family ='黑體-繁 中黑', 
                                  size = rel(1.5), face = 'bold'
                                  ),
        plot.title = element_text(size = rel(2), face = 'bold', hjust = 0.5),
        axis.title = element_text(size = rel(1.5), face = 'bold',
                                  colour = 'black'),
        axis.text = element_text(size = rel(1.5), face = 'bold',
                                 colour = 'black'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank()) +
  scale_x_continuous(breaks = seq(0, 14)) +
  geom_pointrange(aes(ymin = ymin, ymax = ymax))+
  facet_wrap(vars(gender))

Extracted data: 
 male <- data.frame(x = 0, y = -.0447358, ymin = -.0497855,  ymax = -.0396861, gender = '男性') %>% 
  add_row(x = 1, y = -.0180776, ymin = -.0230804, ymax = -.0130748, gender = '男性') %>% 
  add_row(x = 2, y = -.016423, ymin = -.0213736,   ymax = -.0114724, gender = '男性') %>% 
   add_row(x = 3, y = -.0129881, ymin = -.0178787,  ymax = -.0080975, gender = '男性')%>%
   add_row(x = 4, y = -.0103175, ymin = -.015139,   ymax = -.0054961, gender = '男性')%>%
   add_row(x = 5, y = -.0082522, ymin = -.0130095, ymax = -.0034949, gender = '男性')%>%
   add_row(x = 6, y = -.0071008, ymin = -.0118032, ymax = -.0023985, gender = '男性')%>%
   add_row(x = 7, y = -.0070145, ymin = -.0116721, ymax = -.0023569, gender = '男性')%>%
   add_row(x = 8, y = -.0056933, ymin = -.0103182, ymax = -.0010684, gender = '男性')%>%
   add_row(x = 9, y = -.0047233, ymin = -.0093261, ymax = -.0001205, gender = '男性')%>%
   add_row(x = 10, y = -.003273, ymin = -.0078732, ymax = .0013272, gender = '男性')%>%
   add_row(x = 11, y = .0006229, ymin = -.0040254, ymax = .0052711, gender = '男性')%>%
   add_row(x = 12, y = .0037801, ymin = -.0010039, ymax = .0085641, gender = '男性')%>%
   add_row(x = 13, y = .0032255, ymin = -.0017867, ymax = .0082376, gender = '男性')%>%
   add_row(x = 14, y = .0029918, ymin = -.0026945, ymax = .008678,  gender = '男性')

female <-   data.frame(x = 0, y = -.0557045, ymin = -.0594948, ymax = -.0519143, gender = '女性')%>%
   add_row(x = 1, y = -.0237874, ymin = -.0275535, ymax = -.0200212, gender = '女性')%>%
   add_row(x = 2, y = -.0186763, ymin = -.0224115, ymax = -.0149412, gender = '女性')%>%
   add_row(x = 3, y = -.0124177, ymin = -.0161171, ymax = -.0087183, gender = '女性')%>%
   add_row(x = 4, y = -.0069645, ymin = -.0106195, ymax = -.0033096, gender = '女性')%>%
   add_row(x = 5, y = -.0025661, ymin = -.0061792, ymax = .0010469, gender = '女性')%>%
   add_row(x = 6, y = .0009979, ymin = -.0025787, ymax = .0045745, gender = '女性')%>%
   add_row(x = 7, y = .0044623, ymin = .000915, ymax = .0080096, gender = '女性')%>%
   add_row(x = 8, y = .0070437, ymin = .0035184, ymax = .010569, gender = '女性')%>%
   add_row(x = 9, y = .0096577, ymin = .0061462, ymax = .0131692, gender = '女性')%>%
   add_row(x = 10, y = .0120116, ymin = .0085022, ymax = .0155209, gender = '女性')%>%
   add_row(x = 11, y = .0158938, ymin = .0123547,  ymax = .0194329, gender = '女性')%>%
   add_row(x = 12, y = .0227411, ymin = .0191273, ymax = .0263549, gender = '女性')%>%
   add_row(x = 13, y = .0253041, ymin = .0215681, ymax = .0290401, gender = '女性')%>%
   add_row(x = 14, y = .0261749, ymin = .0220729, ymax = .0302769, gender = '女性')
df<- male %>% rbind(female)