首页 > 解决方案 > R ggplot geom_col 绘制一个变量的比例

问题描述

我有一个数据框:

df_silencer <- data.frame(
  group = c("inside_boundaries", "outside_boundaries","inside_boundaries", "outside_boundaries","inside_boundaries", "outside_boundaries","inside_boundaries", "outside_boundaries","inside_boundaries", "outside_boundaries"),
  value = c(18, 408,43,850,36,594,118,1831,1232,22765),
  cond = c('pef1a','pef1a','ppgk','ppgk','prag2','prag2','pscp1','pscp1','DHS','DHS')
)

我试图只绘制“内部边界”的比例,而不是 inside_boundaries 和 outside_boundaries。

这给了我 100% 的内部 + 外部的比例。我正在尝试仅绘制 inside_boundaries 比例

(boundaries_percentage=
    ggplot(df_silencer, 
           aes(x = cond,y = value,color=cond,fill=forcats::fct_rev(as.factor(group)))) +
    geom_col(size=0.7,alpha=0.5,width = 0.7,position = 'fill')+  
    scale_color_manual(name="Condition",breaks = c("pef1a", "ppgk", "prag2","pscp1",'DHS'),
                       values=c("#FFCC33", "#339900", "#FF3333","#3333FF","black"))+
    scale_fill_manual(name="group",breaks = c("inside_boundaries","outside_boundaries"),
                      values=c("#d6d4d4","#ffffff"))+
    scale_x_discrete(limits=c("DHS","pscp1", "ppgk", "pef1a","prag2"))+
    scale_y_continuous(labels=c("0", "25","50","75","100"))+
    theme_classic()+
    theme(text = element_text(size=6),axis.title.x = element_blank())+
    guides(color=F)+
    labs(y="% inside vs outside boundaries" )
)

谢谢

标签: rggplot2

解决方案


这是你要找的吗?

df_silencer %>% 
  group_by(cond) %>% 
  mutate(pct = value/sum(value)) %>% 
  filter(group == "inside_boundaries") %>% 
ggplot(aes(x = cond,y = pct,color=cond, fill=cond)) +
  geom_bar(stat="identity") +  
  scale_color_manual(name="Condition",breaks = c("pef1a", "ppgk", "prag2","pscp1",'DHS'),
                     values=c("#FFCC33", "#339900", "#FF3333","#3333FF","black"))+
  scale_fill_manual(name="Condition",breaks = c("pef1a", "ppgk", "prag2","pscp1",'DHS'),
                    values=c("#FFCC33", "#339900", "#FF3333","#3333FF","black"))+
  scale_x_discrete(limits=c("DHS","pscp1", "ppgk", "pef1a","prag2"))+
  scale_y_continuous(labels=scales::label_percent(accuracy=1))+
  theme_classic()+
  theme(text = element_text(size=6),axis.title.x = element_blank())+
  guides(color=F, fill=F)+
  labs(y="% inside vs outside boundaries" )

在此处输入图像描述


编辑:在栏上添加百分比数字

df_silencer %>% 
  group_by(cond) %>% 
  mutate(pct = value/sum(value)) %>% 
  filter(group == "inside_boundaries") %>% 
ggplot(aes(x = cond,y = pct,color=cond, fill=cond)) +
  geom_bar(stat="identity") +  
  geom_text(aes(label=sprintf("%.1f%%", pct*100)), position=position_nudge(y=.0015)) + 
  scale_color_manual(name="Condition",breaks = c("pef1a", "ppgk", "prag2","pscp1",'DHS'),
                     values=c("#FFCC33", "#339900", "#FF3333","#3333FF","black"))+
  scale_fill_manual(name="Condition",breaks = c("pef1a", "ppgk", "prag2","pscp1",'DHS'),
                    values=c("#FFCC33", "#339900", "#FF3333","#3333FF","black"))+
  scale_x_discrete(limits=c("DHS","pscp1", "ppgk", "pef1a","prag2"))+
  scale_y_continuous(labels=scales::label_percent(accuracy=1))+
  theme_classic()+
  theme(text = element_text(size=6),axis.title.x = element_blank())+
  guides(color=F, fill=F)+
  labs(y="% inside vs outside boundaries" )

在此处输入图像描述


推荐阅读