You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2条形图的每个条形上添加对应E值的黑线?

为ggplot2横向条形图添加对应E值的黑色标线

数据结构

实际数据框结构如下:

structure(list(OCCURED_COUNTRY_DESC = c("AUSTRALIA", "AUSTRIA", 
"BELGIUM", "BRAZIL", "CANADA"), a = c(4L, 7L, 20L, 5L, 11L), 
    b = c(31, 27, 100, 51, 125), c = c(872, 869, 856, 871, 865
    ), d = c(5289, 5293, 5220, 5269, 5195), w = c(876, 876, 876, 
    876, 876), x = c(5320, 5320, 5320, 5320, 5320), y = c(35L, 
    34L, 120L, 56L, 136L), z = c(6161, 6162, 6076, 6140, 6060
    ), N = c(6196, 6196, 6196, 6196, 6196), k = c("0.5", "0.5", 
    "0.5", "0.5", "0.5"), SOR = c(0.80199821407511, 1.52042360060514, 
    1.21312776329214, 0.615857869962066, 0.539569644832803), 
    log = c(-0.318329070860348, 0.604473324558599, 0.278731499148795, 
    -0.699330656240263, -0.890118907611227), LL99 = c(-0.695969674426877, 
    0.382102954188229, 0.198127619344382, -1.00534117464748, 
    -1.03425468471322), UL99 = c(-0.0544058884186467, 0.763880731966007, 
    0.337239065783058, -0.482651467660248, -0.785935460582379
    ), flagged = c("no", "no", "no", "no", "yes"), type = c(NA, 
    NA, NA, NA, "under"), MedDRA_PT = c("Seizure", "Seizure", 
    "Seizure", "Seizure", "Seizure"), E = c(5.11098506333901, 
    4.43283582089552, 16.3984674329502, 8.43063199848168, 20.8132820019249
    )), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))

原绘图代码

当前使用的ggplot2绘图代码如下:

test2 %>% #using test2 as the df
  ggplot(aes(a, OCCURED_COUNTRY_DESC, fill=type)) +
  geom_bar(stat="identity")+
  scale_fill_manual(values = c("disp" = "#FF8C00",
                                "under" = "#7EC0EE",
                                "NA"="#EEE9E9"))+
  theme_classic()+
  labs(title = "Seizure",
       x = "Count",
       y = "")

解决方案

要为每个国家的条形添加对应E值的黑色标线,可使用geom_segment()函数,在每个分类(国家)对应的y轴位置绘制垂直于x轴的线段,修改后的代码如下:

test2 %>%
  ggplot(aes(a, OCCURED_COUNTRY_DESC, fill = type)) +
  geom_bar(stat = "identity") +
  # 添加对应E值的黑色标线
  geom_segment(
    aes(x = E, xend = E, y = OCCURED_COUNTRY_DESC, yend = OCCURED_COUNTRY_DESC),
    color = "black",
    size = 1, # 可调整线的粗细
    linetype = "solid" # 可调整线的样式,比如虚线用"dashed"
  ) +
  scale_fill_manual(values = c("disp" = "#FF8C00",
                               "under" = "#7EC0EE",
                               "NA" = "#EEE9E9")) +
  theme_classic() +
  labs(title = "Seizure",
       x = "Count",
       y = "")

代码说明

  • geom_segment()通过映射x = E和xend = E确定标线的x轴位置,y和yend绑定到国家名称,确保每个国家的标线对应正确的y轴位置。
  • 若希望标线更醒目,可对y和yend做微小调整,例如y = as.numeric(OCCURED_COUNTRY_DESC) - 0.2,yend = as.numeric(OCCURED_COUNTRY_DESC) + 0.2,让标线延伸至条形上下区域。

内容的提问来源于stack exchange,提问作者hmcmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:20:24