如何在R中的ggplot2中合并具有固定区域的2个图像 [英] how to combine 2 images with fixed area in ggplot2 in R

查看:37
本文介绍了如何在R中的ggplot2中合并具有固定区域的2个图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的原始数据.

v <- 
structure(list(Estimate = c(0.233244696051868, 5.48753303603373, 
1.95671969454631, 3.16568487759413, 4.79631204302344, 2.10818637730716, 
0.329940200056173, 0.055145498993132, 0.222410032790494), `Std. Error` = c(1.10523192028695, 
2.75434167314693, 2.52507525836928, 0.964768253150336, 1.73374160980673, 
0.852388938087655, 0.736511882227423, 0.326506324068342, 1.26750100880987
), ID = structure(c(1L, 3L, 2L, 4L, 8L, 5L, 6L, 7L, 9L), .Label = c("CD", 
"MFS2", "MFS", "Crop.Nb", "CD:SNC", "MFS:SNC", "CD:MFS", "SNC", 
"SNC2"), class = "factor"), group = structure(c(1L, 1L, 1L, 1L, 
3L, 2L, 2L, 2L, 3L), .Label = c("crop", "inter", "semi"), class = "factor"), 
    ES = c(-0.233244696051868, -5.48753303603373, 1.95671969454631, 
    3.16568487759413, 4.79631204302344, 2.10818637730716, 0.329940200056173, 
    0.055145498993132, 0.222410032790494)), class = "data.frame", row.names = c(NA, 
-9L))

我想绘制2张图像,如下所示:

I want to plot 2 images as below:

p1 <- v %>% ggplot(aes(x = factor(ID), y = ES, color = factor(group))) +
  geom_hline(yintercept = 0) + 
  geom_errorbar(aes(ymin = ES - `Std. Error`,ymax = ES + `Std. Error`),
                width = 0, lwd = 1.5
                )+
  coord_flip()+
  geom_text(aes(label = ID), nudge_y = .6,nudge_x = .2)+
  geom_point(size = 4)+
  scale_color_discrete()+
  theme(axis.text.y = element_blank()) +
  xlab('') +  guides(color = FALSE)

(p2 <-  arrange(v,desc(group)) %>% ggplot(aes(x = '1', y =Estimate, fill = group )) +
    #geom_bar(position = 'fill', stat = 'identity') +
    geom_col(position = position_fill(reverse = TRUE)) +
    scale_y_continuous(labels = scales::percent, name = "Variance explained")+
    theme(legend.position = 'none', axis.title.x = element_blank(), axis.text.x = element_blank()) )

现在我想将p2和p1结合起来:我得到了:

Now I want to combine p2 and p1: I get:

cowplot::plot_grid(p2,p1,nrow = 1, rel_widths = c(0.2,1))

但是我想要达到的效果如下:小组A:我希望p1和p2之间的距离不那么窄;红色区域只有红色条形;绿色区域只有绿色条;希望您能帮助我完成以下B小组的草案:

But what I want to achieve the effect as below: Panel A : I wish the distance between p1 and p2 is less narrow; And red area only has red bars; Green area only has green bars; I wish you can help me to achieve the draft of panel B as below:

推荐答案

为确保正确对齐,将两个部分放在同一图中可能会更整洁.另外,我不太希望在这里翻转坐标,所以我选择了一个简单的版本:

To ensure proper alignment, it might be neater to have both parts in the same plot. Also, I don't quite see the need to flip your coordinates here, so I went with a simpler version:

v %>%

  # calculate y-axis positions within [0%, 100%] range
  arrange(group) %>%
  mutate(y = seq(0.5, by = 1, length.out = n())) %>%
  mutate(y = y / ceiling(max(y))) %>%
  
  ggplot(aes(y = y, x = ES, label = ID, color = group,
             xmin = ES - `Std. Error`, xmax = ES + `Std. Error`)) +
  geom_vline(xintercept = 0) + 
  geom_pointrange(lwd = 1.5, fatten = 2) + # instead of flipped errorbar with 0 width + point
  geom_text(nudge_y = 0.05) +
  geom_bar(aes(x = -10, fill = group), # change this to shift the bar closer / further away
           position = position_fill(reverse = TRUE),
           inherit.aes = FALSE) +

  scale_y_continuous(name = "Variance explained", labels = scales::percent) +

  # actually not necessary to have this line for default palette, but in case
  # you want to change that, the `aesthetics = c("colour", "fill")` line saves you from
  # having to specify the same palette twice in both colour & fill scales.
  scale_color_discrete(aesthetics = c("colour", "fill")) + 

  theme_minimal() + # or whatever theme you need
  theme(legend.position = "none")

这篇关于如何在R中的ggplot2中合并具有固定区域的2个图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆