简体   繁体   中英

Add horizontal indicator lines for confidence intervals on a geom_linerange() in ggplot2

I am trying to produce a chart of Obersved / Expected hospital infection rates with error bars showing upper and and lower 95% and 99.7% confidence intervals.

Here are the data:

orthssi <- structure(list(Hospital = structure(1:18, .Label = c("A", "B", 
"C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", 
"P", "Q", "R"), class = "factor"), SSIs = c(80L, 38L, 24L, 35L, 
39L, 30L, 128L, 27L, 70L, 30L, 30L, 2L, 6L, 38L, 3L, 9L, 52L, 
13L), Procedures = c(865L, 1069L, 796L, 891L, 997L, 550L, 2598L, 
373L, 1079L, 714L, 477L, 227L, 125L, 589L, 292L, 149L, 1984L, 
351L), Expected = c(44.89, 51.149, 35.15, 42.495, 46.987, 26.999, 
105.032, 18.304, 57.402, 31.409, 23.497, 10.898, 5.945, 29.614, 
13.295, 6.403, 88.449, 16.083), OE = c(1.782, 0.743, 0.683, 0.824, 
0.83, 1.111, 1.219, 1.475, 1.219, 0.955, 1.277, 0.184, 1.009, 
1.283, 0.226, 1.406, 0.588, 0.808), Probability = c(0.092, 0.036, 
0.03, 0.039, 0.039, 0.055, 0.049, 0.072, 0.065, 0.042, 0.063, 
0.009, 0.048, 0.065, 0.01, 0.06, 0.026, 0.037), Lower95CI = c(1.42623345874945, 
0.528256888855857, 0.439593399216354, 0.576826930846085, 0.593304300509315, 
0.755779204034742, 1.02072916367972, 0.983076938281617, 0.957133142026683, 
0.648442622896373, 0.86951670130161, 0.0222623281070364, 0.374607285544628, 
0.916025825389466, 0.0466447169655834, 0.651315412316165, 0.440436907019126, 
0.433548700419708), Upper95CI = c(2.19254259114914, 1.01294537379558, 
1.00844478624614, 1.13663544526487, 1.12647704263608, 1.56764294951526, 
1.44220199258348, 2.11060633474044, 1.52742490796631, 1.35122425878491, 
1.7979937836084, 0.655351540870752, 2.13516991355386, 1.73993010418865, 
0.652957058228699, 2.59615214768047, 0.76780774565962, 1.36405674299719
), Lower997CI = c(1.26545076052984, 0.438514548720716, 0.344268212303677, 
0.474612391243614, 0.493987129703437, 0.611131699675563, 0.929047103197505, 
0.785094671227173, 0.840231592610583, 0.523894662155343, 0.703500240342274, 
0.00513071434039922, 0.20498124083422, 0.761788735802099, 0.0165744691173032, 
0.414157407130073, 0.376765181801129, 0.303424472695538), Upper997CI = c(2.41408837016438, 
1.16380466027892, 1.19392754588927, 1.31181443961792, 1.29178515824501, 
1.82316431734875, 1.56260724140783, 2.46519277997175, 1.69514346690893, 
1.57391071859294, 2.08889292293282, 0.966984581231215, 2.80639425224956, 
1.99287051089929, 0.928351140481638, 3.28891183173877, 0.867510832843342, 
1.68791001193251)), .Names = c("Hospital", "SSIs", "Procedures", 
"Expected", "OE", "Probability", "Lower95CI", "Upper95CI", "Lower997CI", 
"Upper997CI"), row.names = c(NA, -18L), class = "data.frame")
> ssi0106 <- dput(orthssi)
structure(list(Hospital = structure(1:18, .Label = c("A", "B", 
"C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", 
"P", "Q", "R"), class = "factor"), SSIs = c(80L, 38L, 24L, 35L, 
39L, 30L, 128L, 27L, 70L, 30L, 30L, 2L, 6L, 38L, 3L, 9L, 52L, 
13L), Procedures = c(865L, 1069L, 796L, 891L, 997L, 550L, 2598L, 
373L, 1079L, 714L, 477L, 227L, 125L, 589L, 292L, 149L, 1984L, 
351L), Expected = c(44.89, 51.149, 35.15, 42.495, 46.987, 26.999, 
105.032, 18.304, 57.402, 31.409, 23.497, 10.898, 5.945, 29.614, 
13.295, 6.403, 88.449, 16.083), OE = c(1.782, 0.743, 0.683, 0.824, 
0.83, 1.111, 1.219, 1.475, 1.219, 0.955, 1.277, 0.184, 1.009, 
1.283, 0.226, 1.406, 0.588, 0.808), Probability = c(0.092, 0.036, 
0.03, 0.039, 0.039, 0.055, 0.049, 0.072, 0.065, 0.042, 0.063, 
0.009, 0.048, 0.065, 0.01, 0.06, 0.026, 0.037), Lower95CI = c(1.42623345874945, 
0.528256888855857, 0.439593399216354, 0.576826930846085, 0.593304300509315, 
0.755779204034742, 1.02072916367972, 0.983076938281617, 0.957133142026683, 
0.648442622896373, 0.86951670130161, 0.0222623281070364, 0.374607285544628, 
0.916025825389466, 0.0466447169655834, 0.651315412316165, 0.440436907019126, 
0.433548700419708), Upper95CI = c(2.19254259114914, 1.01294537379558, 
1.00844478624614, 1.13663544526487, 1.12647704263608, 1.56764294951526, 
1.44220199258348, 2.11060633474044, 1.52742490796631, 1.35122425878491, 
1.7979937836084, 0.655351540870752, 2.13516991355386, 1.73993010418865, 
0.652957058228699, 2.59615214768047, 0.76780774565962, 1.36405674299719
), Lower997CI = c(1.26545076052984, 0.438514548720716, 0.344268212303677, 
0.474612391243614, 0.493987129703437, 0.611131699675563, 0.929047103197505, 
0.785094671227173, 0.840231592610583, 0.523894662155343, 0.703500240342274, 
0.00513071434039922, 0.20498124083422, 0.761788735802099, 0.0165744691173032, 
0.414157407130073, 0.376765181801129, 0.303424472695538), Upper997CI = c(2.41408837016438, 
1.16380466027892, 1.19392754588927, 1.31181443961792, 1.29178515824501, 
1.82316431734875, 1.56260724140783, 2.46519277997175, 1.69514346690893, 
1.57391071859294, 2.08889292293282, 0.966984581231215, 2.80639425224956, 
1.99287051089929, 0.928351140481638, 3.28891183173877, 0.867510832843342, 
1.68791001193251)), .Names = c("Hospital", "SSIs", "Procedures", 
"Expected", "OE", "Probability", "Lower95CI", "Upper95CI", "Lower997CI", 
"Upper997CI"), row.names = c(NA, -18L), class = "data.frame")

Here is my ggplot code to produce the plot:

ggplot(data=orthssi, mapping=aes(x=Hospital, y=OE, ymin = Lower997CI, ymax = Upper997CI)) + 
    geom_hline(yintercept=1, colour='gray') + 
    geom_point(colour='blue', size=3) + 
    scale_y_continuous(limits=c(0,ceiling(max(orthssi$Upper997CI)))) + 
    geom_linerange(mapping=aes(x=Hospital))   + 
    theme_bw() +  theme(panel.grid.major.x = element_blank())

It produces the following chart: 医院的O / E感染率

What I would like to do, and cannot manage, it to place small horizontal ticks on the geom_linerange() indicating the position of the upper and lower 95% an 99.7% confidence intervals.

EDIT If you are a ggplot ninja I would also accept different line colours indicating where the 99.7& CIs extend past the 95% CIs.

Any help offered on how to add these ticks/colours is greatly appreciated.

geom_errorbar will create a line range with horizonal bars at the end. As such, the following will work

ggplot(data=orthssi, mapping=aes(x=Hospital, y=OE, ymin = Lower997CI, ymax = Upper997CI)) + 
  geom_hline(yintercept = 1, colour = 'gray') + 
  geom_point(colour = 'blue', size = 3) + 
  scale_y_continuous(limits=c(0, ceiling(max(orthssi$Upper997CI)))) + 
  theme_bw() +  theme(panel.grid.major.x = element_blank()) + 
  geom_errorbar(aes(ymin = Lower95CI,ymax = Upper95CI),width = 0.2,colour = 'red') +
  geom_errorbar(width = 0.2) 

在此输入图像描述

Note that the geom_linerange(mapping = aes(x = Hospital)) component has been removed as it is drawn as part of geom_errorbar(width = 0.2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM