How do I plot the expected values ββand the reference value in R?
I am plotting observables per location with dots and errors that work as expected.
Problems:
-
I am also trying to plot the expected value for each location as a short horizontal line, centered the same as the point. I use segments for this, lines appear, however they are not centered and I cannot figure out how to control them.
-
I would like to plot a reference value that will be the same year for all locations, but changes from year to year. I am getting a line with geom_line, but it is oblique and I would like to have steps (or two break lines). With geom_steps, I get the vertical shift at each location, not a year. I tried
geom_hline
, but with the data.frame definition withhline.data<-data.frame(hy=chunk$Reference.Value, hx=chunk$Year)
a, get two parallel lines across the whole plot.
Could you show me what I am doing wrong? Thank you so much in advance!
Code with my attempts:
library(data.table)
library(ggplot2)
chunk<-fread("
Year;Places;Code;Name;Reference.Value;Value;Expected.Value;CI
2010;Place5;A12;Indicator;0.079;0.087;0.082;0.00286
2010;Place1;A12;Indicator;0.079;0.075;0.086;0.02317
2010;Place2;A12;Indicator;0.079;0.059;0.069;0.01955
2010;Place3;A12;Indicator;0.079;0.065;0.067;0.02712
2010;Place4;A12;Indicator;0.079;0.091;0.101;0.03211
2011;Place5;A12;Indicator;0.077;0.062;0.058;0.00260
2011;Place1;A12;Indicator;0.077;0.078;0.069;0.01736
2011;Place2;A12;Indicator;0.077;0.029;0.037;0.02821
2011;Place3;A12;Indicator;0.077;0.062;0.059;0.02166
2011;Place4;A12;Indicator;0.077;0.110;0.099;0.06452")
chunk[,`:=` (Year = as.factor(Year),
Places = as.factor(Places),
Code = as.factor(Code),
Name = as.factor(Name)
)]
limits <- aes(ymax = Value+CI, ymin=Value-CI)
dodge <- position_dodge(width=0.9)
p <- ggplot(chunk, aes(colour=Places, fill=Places, y=Value, x=Year))
p + geom_linerange(limits, position=dodge) +
geom_point(position=dodge, size = 5) +
geom_segment(position=dodge,
aes(group=Places,
y=Expected.Value, yend=Expected.Value,
x=as.numeric(Year)-0.01, xend=as.numeric(Year)+0.01)
) +
geom_line(position=dodge, aes(group=Places, y=Reference.Value,x=Year), color="black")
# geom_step(position=dodge, direction="vh", aes(group=Places,y=Reference.Value,x=Year), color="black")
source to share
Here's my interpretation. You can get the "dodge" offsets and use them to start / end your line segments. group
there will be in all geoms Year
, and the deviations determined by dodge simply say how far the grouping of factors should be Place
.
## Get offsets for dodge
dodgeWidth <- 0.9
nFactors <- length(levels(chunk[,Places]))
chunk[, `:=` (dPlaces = (dodgeWidth/nFactors)*(as.numeric(Places) - mean(as.numeric(Places))))]
limits <- aes(ymax = Value+CI, ymin=Value-CI)
dodge <- position_dodge(width=0.9)
p <- ggplot(chunk, aes(colour=Places, fill=Places, y=Value, x=Year))
p + geom_linerange(limits, position=dodge) +
geom_point(position=dodge, size = 5) +
geom_segment(position=dodge, aes(y=Expected.Value, yend=Expected.Value,
x=as.numeric(Year)+dPlaces-0.1, xend=as.numeric(Year)+dPlaces+0.1)) +
geom_step(aes(group=Year, y=Reference.Value,
x=as.numeric(Year)+dPlaces), color="black", linetype=2)
source to share
You can use geom_errorbar
with the stat = "hline"
same as in this answer to get the horizontal lines sloping as you want. You would use geom_errorbar
twice, once for adding lines Expected.Value
and once for lines Reference.Value
.
ggplot(chunk, aes(colour=Places, fill=Places, y=Value, x=Year)) +
geom_linerange(limits, position=dodge) +
geom_point(position=dodge, size = 5) +
geom_errorbar(stat = "hline", aes(yintercept = Expected.Value, ymax = ..y.., ymin = ..y..),
position = dodge, width = .8) +
geom_errorbar(stat = "hline", aes(group = Year, yintercept = Reference.Value, ymax = ..y.., ymin = ..y..),
position = dodge, color="black", width = .8, linetype = 2)
Edit
The approach stat = "hline"
no longer works in the R development version behind this github issue . However, it geom_errorbar
can be used directly to achieve the same result.
ggplot(chunk, aes(colour=Places, fill=Places, y=Value, x=Year)) +
geom_linerange(limits, position=dodge) +
geom_point(position=dodge, size = 5) +
geom_errorbar(aes(y = Expected.Value, ymax = ..y.., ymin = ..y..),
position = dodge, width = .8) +
geom_errorbar(aes(group = Year, y = Reference.Value, ymax = ..y.., ymin = ..y..),
position = dodge, color="black", width = .8, linetype = 2)
source to share