Как объяснил lbusett , ответ на этот вопрос не столько о графике, сколько о преобразовании данных из широкой в длинную форму.Проблема здесь заключается в том, что существует несколько столбцов значений, то есть Estimate
, Max
, Min
для каждого пола.
Начиная с версии v1.9.6 (на CRAN 19 сентября 2015 г.), data.table Воплощение функции melt()
позволяет плавно, т.е. преобразовывать из широкого в длинный формат, в несколько столбцов за один раз:
library(data.table)
options(datatable.print.class = TRUE)
cols <- c("Estimate", "Max", "Min")
long <- melt(setDT(GenderModeCombined), id.vars = "Year", measure.vars = patterns(cols),
value.name = cols, variable.name = "Gender")[
, Gender := forcats::lvls_revalue(Gender, c("M", "F"))][]
long
Year Gender Estimate Max Min
<int> <fctr> <num> <num> <num>
1: 2005 M 3.0 3.5 2.5
2: 2006 M 3.1 3.5 2.6
3: 2007 M 5.0 4.2 5.8
4: 2005 F 2.0 2.3 1.7
5: 2006 F 2.0 2.3 1.7
6: 2007 F 2.5 3.0 2.0
Теперь у нас есть три наблюдения для Year
и Gender
, которые можно построить по желанию:
library(ggplot2)
ggplot(long, aes(x = Year, y = Estimate, colour = Gender)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymax = Max, ymin = Min), width = 0.1)
Обратите внимание, что на этом графике также показаны линии в дополнение к точкам и барам ошибок.Это связано с тем, что Year
имеет тип целое число , которое ggplot2
распознается как непрерывная переменная.
Данные
data.table 'Функция s fread()
очень удобна для чтения различных форматов данных.Таким образом, мы можем прочитать данные, опубликованные ОП, только с несколькими изменениями:
library(data.table)
GenderModeCombined <- fread(
"| Year | EstimateM | MaxM | MinM | EstimateF | MaxF | MinF |
| 2005 | 3.0 | 3.5 | 2.5 | 2.0 | 2.3 | 1.7 |
| 2006 | 3.1 | 3.5 | 2.6 | 2.0 | 2.3 | 1.7 |
| 2007 | 5.0 | 4.2 | 5.8 | 2.5 | 3.0 | 2.0 |
", drop = c(1L, 9L))
GenderModeCombined
Year EstimateM MaxM MinM EstimateF MaxF MinF
<int> <num> <num> <num> <num> <num> <num>
1: 2005 3.0 3.5 2.5 2.0 2.3 1.7
2: 2006 3.1 3.5 2.6 2.0 2.3 1.7
3: 2007 5.0 4.2 5.8 2.5 3.0 2.0