Nuestro objetivo es construir un gráfico que muestre la velocidad de diferentes individuos a lo largo del tiempo. La variable velocidad se mostrará en el eje y y el tiempo en el eje x. Tenemos una matriz de datos con cuatro individuos y la velocidad de cada individuo en diferentes tiempos (en horas)
Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:
setwd(dir = "F:/R/MARKDOWN-ggplot2/graphggplot2/")
datos<-read.table("timevelocity.csv", sep = ";", header = TRUE, dec = ".")
datos
## hours Individual1 Individual2 Individual3 Individual4
## 1 0 30 12 100 10
## 2 1 24 12 99 20
## 3 24 29 15 98 25
## 4 25 34 21 89 36
## 5 48 33 23 96 68
## 6 49 39 22 56 69
## 7 72 41 26 68 75
## 8 74 39 34 98 78
## 9 96 29 35 98 101
## 10 98 45 36 97 102
## 11 112 41 41 98 100
## 12 124 42 39 97 103
## 13 128 46 45 100 10
## 14 135 45 46 99 20
## 15 139 57 48 98 102
## 16 165 42 49 86 102
## 17 167 35 49 85 68
## 18 169 39 50 84 120
## 19 175 36 52 82 75
## 20 179 23 56 83 78
## 21 180 29 55 80 101
## 22 185 27 59 75 102
## 23 186 42 49 77 100
## 24 199 42 56 70 103
## 25 200 34 51 72 101
## 26 202 33 59 75 102
## 27 203 39 62 98 115
## 28 205 41 66 86 114
## 29 210 34 69 89 125
## 30 212 41 75 95 136
## 31 219 33 77 94 122
## 32 222 22 74 92 102
## 33 225 20 79 86 109
## 34 235 33 89 101 105
## 35 236 34 95 102 101
## 36 239 41 94 99 102
## 37 245 33 99 89 88
## 38 255 34 99 79 89
## 39 256 33 98 96 85
## 40 266 39 97 86 99
## 41 268 41 97 101 101
## 42 269 26 98 102 102
## 43 274 20 95 110 99
## 44 279 25 91 99 98
## 45 280 24 94 98 95
str(datos)
## 'data.frame': 45 obs. of 5 variables:
## $ hours : int 0 1 24 25 48 49 72 74 96 98 ...
## $ Individual1: int 30 24 29 34 33 39 41 39 29 45 ...
## $ Individual2: int 12 12 15 21 23 22 26 34 35 36 ...
## $ Individual3: int 100 99 98 89 96 56 68 98 98 97 ...
## $ Individual4: int 10 20 25 36 68 69 75 78 101 102 ...
Cargamos el paquete ggplot2
con library
y creamos el gráfico con ggplot
. Le indicamos nuestros datos, y con aes
que variables mostrará en el eje x y en el y.
library(ggplot2)
gr1<- ggplot(datos, aes(x=hours, y=Individual1)) +
geom_line()
gr1
Podemos cambiar los rótulos de los ejes x e y. Ahora simplemente al objeto con la figura (gr1) le sumamos xlab
e ylab
.
gr1+xlab("Hours") +
ylab("Velocity")
Con stat_smooth
añadimos en este caso un modelo de tendencia libre con sus límites de confianza.
gr1+xlab("Hours") +
ylab("Velocity")+
stat_smooth(color = "#FC4E08", fill = "#FC4E07",
method = "loess")
## `geom_smooth()` using formula 'y ~ x'
Vamos a utilizar la función gather
para cambiar nuestra matriz de datos. En este caso crearemos una variable con la velocidad, otra con un indicador de cada individuo (el 1 y el 2) y otra con el tiempo:
library(tidyr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
datosnew <- datos %>%
select(hours, Individual1, Individual2) %>%
gather(key = "twoindividuals", value = "velocity2", -hours)
head(df, 3)
##
## 1 function (x, df1, df2, ncp, log = FALSE)
## 2 {
## 3 if (missing(ncp))
datosnew
## hours twoindividuals velocity2
## 1 0 Individual1 30
## 2 1 Individual1 24
## 3 24 Individual1 29
## 4 25 Individual1 34
## 5 48 Individual1 33
## 6 49 Individual1 39
## 7 72 Individual1 41
## 8 74 Individual1 39
## 9 96 Individual1 29
## 10 98 Individual1 45
## 11 112 Individual1 41
## 12 124 Individual1 42
## 13 128 Individual1 46
## 14 135 Individual1 45
## 15 139 Individual1 57
## 16 165 Individual1 42
## 17 167 Individual1 35
## 18 169 Individual1 39
## 19 175 Individual1 36
## 20 179 Individual1 23
## 21 180 Individual1 29
## 22 185 Individual1 27
## 23 186 Individual1 42
## 24 199 Individual1 42
## 25 200 Individual1 34
## 26 202 Individual1 33
## 27 203 Individual1 39
## 28 205 Individual1 41
## 29 210 Individual1 34
## 30 212 Individual1 41
## 31 219 Individual1 33
## 32 222 Individual1 22
## 33 225 Individual1 20
## 34 235 Individual1 33
## 35 236 Individual1 34
## 36 239 Individual1 41
## 37 245 Individual1 33
## 38 255 Individual1 34
## 39 256 Individual1 33
## 40 266 Individual1 39
## 41 268 Individual1 41
## 42 269 Individual1 26
## 43 274 Individual1 20
## 44 279 Individual1 25
## 45 280 Individual1 24
## 46 0 Individual2 12
## 47 1 Individual2 12
## 48 24 Individual2 15
## 49 25 Individual2 21
## 50 48 Individual2 23
## 51 49 Individual2 22
## 52 72 Individual2 26
## 53 74 Individual2 34
## 54 96 Individual2 35
## 55 98 Individual2 36
## 56 112 Individual2 41
## 57 124 Individual2 39
## 58 128 Individual2 45
## 59 135 Individual2 46
## 60 139 Individual2 48
## 61 165 Individual2 49
## 62 167 Individual2 49
## 63 169 Individual2 50
## 64 175 Individual2 52
## 65 179 Individual2 56
## 66 180 Individual2 55
## 67 185 Individual2 59
## 68 186 Individual2 49
## 69 199 Individual2 56
## 70 200 Individual2 51
## 71 202 Individual2 59
## 72 203 Individual2 62
## 73 205 Individual2 66
## 74 210 Individual2 69
## 75 212 Individual2 75
## 76 219 Individual2 77
## 77 222 Individual2 74
## 78 225 Individual2 79
## 79 235 Individual2 89
## 80 236 Individual2 95
## 81 239 Individual2 94
## 82 245 Individual2 99
## 83 255 Individual2 99
## 84 256 Individual2 98
## 85 266 Individual2 97
## 86 268 Individual2 97
## 87 269 Individual2 98
## 88 274 Individual2 95
## 89 279 Individual2 91
## 90 280 Individual2 94
Creamos la figura sencilla. Cada individuo de un color diferente:
ggplot(datosnew, aes(x = hours, y = velocity2)) +
geom_line(aes(color = twoindividuals), size = 1) +
scale_color_manual(values = c("red", "blue")) +
theme_minimal()+
xlab("Hours") +
ylab("Velocity")
Cambiamos geom_line
por geom_areas
:
gr2<-ggplot(datosnew, aes(x = hours, y = velocity2)) +
geom_area(aes(color = twoindividuals, fill = twoindividuals),
alpha = 0.5, position = position_dodge(0.8)) +
scale_color_manual(values = c("red", "blue")) +
theme_minimal()+
xlab("Hours") +
ylab("Velocity")
gr2
Añdimos un modelo lineal para los dos individuos juntos por medio de stat_smooth
indicando el modelo lm
:
gr2+stat_smooth(method = "lm", formula = y ~ x, se = TRUE)
Añadimos un modelo lineal para cada uno de los individuos por medio de stst_smooth
indicando el modelo lm
pero indicando en aes
el color con el factor twoindividuals
:
gr3<-ggplot(datosnew, aes(hours, velocity2, colour =twoindividuals )) +
geom_point() +
geom_smooth(method = "lm", formula = y ~ x, se = TRUE)
gr3
Añadimos un modelo libre para cada uno de los individuos por medio de stst_smooth
no indicando nada en geom_smooth
:
gr4<-ggplot(datosnew, aes(hours, velocity2, colour =twoindividuals )) +
geom_point() +
geom_smooth()
gr4
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
#Rótulos
gr4+ xlab("Hours") +
ylab("Velocity")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Repetimos el paso indicado anteriormente, transformando una nueva matriz con los cuatro individuos en una misma columna (velocidades, indicador de individuo e indicador del tiempo):
library(tidyr)
library(dplyr)
datosnew2 <- datos %>%
select(hours, Individual1, Individual2,Individual3,Individual4) %>%
gather(key = "twoindividuals", value = "velocity2", -hours)
head(df, 3)
##
## 1 function (x, df1, df2, ncp, log = FALSE)
## 2 {
## 3 if (missing(ncp))
datosnew2
## hours twoindividuals velocity2
## 1 0 Individual1 30
## 2 1 Individual1 24
## 3 24 Individual1 29
## 4 25 Individual1 34
## 5 48 Individual1 33
## 6 49 Individual1 39
## 7 72 Individual1 41
## 8 74 Individual1 39
## 9 96 Individual1 29
## 10 98 Individual1 45
## 11 112 Individual1 41
## 12 124 Individual1 42
## 13 128 Individual1 46
## 14 135 Individual1 45
## 15 139 Individual1 57
## 16 165 Individual1 42
## 17 167 Individual1 35
## 18 169 Individual1 39
## 19 175 Individual1 36
## 20 179 Individual1 23
## 21 180 Individual1 29
## 22 185 Individual1 27
## 23 186 Individual1 42
## 24 199 Individual1 42
## 25 200 Individual1 34
## 26 202 Individual1 33
## 27 203 Individual1 39
## 28 205 Individual1 41
## 29 210 Individual1 34
## 30 212 Individual1 41
## 31 219 Individual1 33
## 32 222 Individual1 22
## 33 225 Individual1 20
## 34 235 Individual1 33
## 35 236 Individual1 34
## 36 239 Individual1 41
## 37 245 Individual1 33
## 38 255 Individual1 34
## 39 256 Individual1 33
## 40 266 Individual1 39
## 41 268 Individual1 41
## 42 269 Individual1 26
## 43 274 Individual1 20
## 44 279 Individual1 25
## 45 280 Individual1 24
## 46 0 Individual2 12
## 47 1 Individual2 12
## 48 24 Individual2 15
## 49 25 Individual2 21
## 50 48 Individual2 23
## 51 49 Individual2 22
## 52 72 Individual2 26
## 53 74 Individual2 34
## 54 96 Individual2 35
## 55 98 Individual2 36
## 56 112 Individual2 41
## 57 124 Individual2 39
## 58 128 Individual2 45
## 59 135 Individual2 46
## 60 139 Individual2 48
## 61 165 Individual2 49
## 62 167 Individual2 49
## 63 169 Individual2 50
## 64 175 Individual2 52
## 65 179 Individual2 56
## 66 180 Individual2 55
## 67 185 Individual2 59
## 68 186 Individual2 49
## 69 199 Individual2 56
## 70 200 Individual2 51
## 71 202 Individual2 59
## 72 203 Individual2 62
## 73 205 Individual2 66
## 74 210 Individual2 69
## 75 212 Individual2 75
## 76 219 Individual2 77
## 77 222 Individual2 74
## 78 225 Individual2 79
## 79 235 Individual2 89
## 80 236 Individual2 95
## 81 239 Individual2 94
## 82 245 Individual2 99
## 83 255 Individual2 99
## 84 256 Individual2 98
## 85 266 Individual2 97
## 86 268 Individual2 97
## 87 269 Individual2 98
## 88 274 Individual2 95
## 89 279 Individual2 91
## 90 280 Individual2 94
## 91 0 Individual3 100
## 92 1 Individual3 99
## 93 24 Individual3 98
## 94 25 Individual3 89
## 95 48 Individual3 96
## 96 49 Individual3 56
## 97 72 Individual3 68
## 98 74 Individual3 98
## 99 96 Individual3 98
## 100 98 Individual3 97
## 101 112 Individual3 98
## 102 124 Individual3 97
## 103 128 Individual3 100
## 104 135 Individual3 99
## 105 139 Individual3 98
## 106 165 Individual3 86
## 107 167 Individual3 85
## 108 169 Individual3 84
## 109 175 Individual3 82
## 110 179 Individual3 83
## 111 180 Individual3 80
## 112 185 Individual3 75
## 113 186 Individual3 77
## 114 199 Individual3 70
## 115 200 Individual3 72
## 116 202 Individual3 75
## 117 203 Individual3 98
## 118 205 Individual3 86
## 119 210 Individual3 89
## 120 212 Individual3 95
## 121 219 Individual3 94
## 122 222 Individual3 92
## 123 225 Individual3 86
## 124 235 Individual3 101
## 125 236 Individual3 102
## 126 239 Individual3 99
## 127 245 Individual3 89
## 128 255 Individual3 79
## 129 256 Individual3 96
## 130 266 Individual3 86
## 131 268 Individual3 101
## 132 269 Individual3 102
## 133 274 Individual3 110
## 134 279 Individual3 99
## 135 280 Individual3 98
## 136 0 Individual4 10
## 137 1 Individual4 20
## 138 24 Individual4 25
## 139 25 Individual4 36
## 140 48 Individual4 68
## 141 49 Individual4 69
## 142 72 Individual4 75
## 143 74 Individual4 78
## 144 96 Individual4 101
## 145 98 Individual4 102
## 146 112 Individual4 100
## 147 124 Individual4 103
## 148 128 Individual4 10
## 149 135 Individual4 20
## 150 139 Individual4 102
## 151 165 Individual4 102
## 152 167 Individual4 68
## 153 169 Individual4 120
## 154 175 Individual4 75
## 155 179 Individual4 78
## 156 180 Individual4 101
## 157 185 Individual4 102
## 158 186 Individual4 100
## 159 199 Individual4 103
## 160 200 Individual4 101
## 161 202 Individual4 102
## 162 203 Individual4 115
## 163 205 Individual4 114
## 164 210 Individual4 125
## 165 212 Individual4 136
## 166 219 Individual4 122
## 167 222 Individual4 102
## 168 225 Individual4 109
## 169 235 Individual4 105
## 170 236 Individual4 101
## 171 239 Individual4 102
## 172 245 Individual4 88
## 173 255 Individual4 89
## 174 256 Individual4 85
## 175 266 Individual4 99
## 176 268 Individual4 101
## 177 269 Individual4 102
## 178 274 Individual4 99
## 179 279 Individual4 98
## 180 280 Individual4 95
Y ahora representamos la figura:
gr5<-ggplot(datosnew2, aes(hours, velocity2, colour =twoindividuals )) +
geom_point() +
geom_smooth() +#modelo libre
xlab("Hours") +#rótulos eje x e y
ylab("Velocity")
gr5
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Cambiamos a un modelo lineal para cada uno de los individuos:
gr6<-ggplot(datosnew2, aes(hours, velocity2, colour =twoindividuals )) +
geom_point() +
geom_smooth(method = "lm", formula = y ~ x, se = TRUE)+#modelo lineal
xlab("Hours") +
ylab("Velocity")
gr6
Ahora representaremos la media de los cuatro individuos para cada tiempo. Para ello calcularemos primero los valores a representar con la función summarySE
aplicando a la variable de la velocidad agrupada por el tiempo. Se requiere el paquete Rmisc
:
library(Rmisc)
## Loading required package: lattice
## Loading required package: plyr
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
nuevos <- summarySE(datosnew2, measurevar="velocity2", groupvars=c("hours"))
nuevos
## hours N velocity2 sd se ci
## 1 0 4 38.00 42.30051 21.15026 67.30955
## 2 1 4 38.75 40.47530 20.23765 64.40524
## 3 24 4 41.75 37.95941 18.97970 60.40189
## 4 25 4 45.00 30.07768 15.03884 47.86030
## 5 48 4 55.00 33.45644 16.72822 53.23666
## 6 49 4 46.50 20.43689 10.21845 32.51966
## 7 72 4 52.50 22.95648 11.47824 36.52888
## 8 74 4 62.25 30.90173 15.45086 49.17154
## 9 96 4 65.75 39.06725 19.53362 62.16471
## 10 98 4 70.00 34.32200 17.16100 54.61397
## 11 112 4 70.00 33.49627 16.74813 53.30004
## 12 124 4 70.25 34.46133 17.23067 54.83567
## 13 128 4 50.25 37.15172 18.57586 59.11667
## 14 135 4 52.50 33.25157 16.62578 52.91066
## 15 139 4 76.25 27.71732 13.85866 44.10445
## 16 165 4 69.75 28.89492 14.44746 45.97827
## 17 167 4 59.25 21.85368 10.92684 34.77408
## 18 169 4 73.25 36.58210 18.29105 58.21028
## 19 175 4 61.25 21.15617 10.57808 33.66418
## 20 179 4 60.00 27.31300 13.65650 43.46108
## 21 180 4 66.25 31.14884 15.57442 49.56475
## 22 185 4 65.75 31.34087 15.67043 49.87031
## 23 186 4 67.00 26.69582 13.34791 42.47900
## 24 199 4 67.75 26.13267 13.06634 41.58292
## 25 200 4 64.50 28.87329 14.43664 45.94384
## 26 202 4 67.25 28.91799 14.45899 46.01497
## 27 203 4 78.50 34.37538 17.18769 54.69890
## 28 205 4 76.75 30.91251 15.45626 49.18870
## 29 210 4 79.25 38.03836 19.01918 60.52752
## 30 212 4 86.75 39.68522 19.84261 63.14804
## 31 219 4 81.50 37.27823 18.63912 59.31799
## 32 222 4 72.50 35.60431 17.80215 56.65440
## 33 225 4 73.50 37.89899 18.94949 60.30575
## 34 235 4 82.00 33.36665 16.68333 53.09379
## 35 236 4 83.00 32.81260 16.40630 52.21217
## 36 239 4 84.00 28.85596 14.42798 45.91628
## 37 245 4 77.25 29.91516 14.95758 47.60169
## 38 255 4 75.25 28.68652 14.34326 45.64666
## 39 256 4 78.00 30.53959 15.26980 48.59531
## 40 266 4 80.25 28.08766 14.04383 44.69374
## 41 268 4 85.00 29.39388 14.69694 46.77222
## 42 269 4 82.00 37.38092 18.69046 59.48139
## 43 274 4 81.00 41.15823 20.57912 65.49193
## 44 279 4 78.25 35.67796 17.83898 56.77159
## 45 280 4 77.75 35.87362 17.93681 57.08294
Ahora representamos la media y el SE. Para ello hay que utilizar la función geom_errorbar
e indicarle el valor máximo y mínimo a representar. En este caso sería la velocidad+SE y la velocidad-SE
gr7<-ggplot(nuevos, aes(x=hours, y=velocity2)) +
geom_errorbar(aes(ymin=velocity2-se, ymax=velocity2+se), width=.1) +
geom_point()
gr7
Se pueden unir las observaciones con líneas:
gr7+geom_line()
Le añadimos modelo lineal y el libre:
gr7+
geom_smooth()#modelo libre
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
gr7+
geom_smooth(method = "lm", formula = y ~ x, se = TRUE)
Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:
setwd(dir = "F:/R/MARKDOWN-ggplot2/graphggplot2/")
datos2<-read.table("timevelocityfactor.csv", sep = ";", header = TRUE, dec = ".")
datos2
## Time Factor meanvelocity SE
## 1 1 A 10 1.0
## 2 2 A 11 2.0
## 3 3 A 12 3.0
## 4 4 A 15 2.0
## 5 5 A 16 1.0
## 6 6 A 14 3.0
## 7 7 A 14 4.0
## 8 8 A 15 2.0
## 9 9 A 13 2.0
## 10 10 A 11 1.0
## 11 11 A 10 3.0
## 12 12 A 9 2.0
## 13 13 A 11 1.0
## 14 14 A 12 3.0
## 15 15 A 13 3.0
## 16 16 A 10 5.0
## 17 17 A 9 0.5
## 18 18 A 11 0.1
## 19 19 A 11 2.0
## 20 20 A 10 3.0
## 21 1 B 19 1.0
## 22 2 B 18 1.0
## 23 3 B 16 2.0
## 24 4 B 17 3.0
## 25 5 B 19 4.0
## 26 6 B 15 3.0
## 27 7 B 18 2.0
## 28 8 B 16 3.0
## 29 9 B 19 2.0
## 30 10 B 19 1.0
## 31 11 B 18 3.0
## 32 12 B 15 2.0
## 33 13 B 14 1.0
## 34 14 B 16 3.0
## 35 15 B 15 3.0
## 36 16 B 12 5.0
## 37 17 B 11 0.5
## 38 18 B 10 3.0
## 39 19 B 8 2.0
## 40 20 B 7 1.0
## 41 1 C 5 3.0
## 42 2 C 3 3.0
## 43 3 C 5 2.0
## 44 4 C 9 2.0
## 45 5 C 10 3.0
## 46 6 C 15 1.0
## 47 7 C 19 4.0
## 48 8 C 21 5.0
## 49 9 C 22 3.0
## 50 10 C 26 1.0
## 51 11 C 25 3.0
## 52 12 C 28 2.0
## 53 13 C 29 1.0
## 54 14 C 35 3.0
## 55 15 C 34 5.0
## 56 16 C 33 0.5
## 57 17 C 36 3.0
## 58 18 C 39 2.0
## 59 19 C 41 1.0
## 60 20 C 50 3.0
str(datos2)
## 'data.frame': 60 obs. of 4 variables:
## $ Time : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Factor : chr "A" "A" "A" "A" ...
## $ meanvelocity: int 10 11 12 15 16 14 14 15 13 11 ...
## $ SE : num 1 2 3 2 1 3 4 2 2 1 ...
Tenemos tres niveles de un factor (A,B y C), con 20 observaciones temporales de la media de velocidad y su SE.
Ahora los representamos:
gr8<-ggplot(datos2, aes(x=Time, y=meanvelocity, colour=Factor)) +
geom_errorbar(aes(ymin=meanvelocity-SE, ymax=meanvelocity+SE), width=.1) +
geom_line() +
geom_point()+
xlab("Hours")+
ylab("Velocity")
gr8
Completamos con modelo libre y lineal:
gr8+geom_smooth()#modelo libre
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
gr8+geom_smooth(method = "lm", formula = y ~ x, se = TRUE)
Podemos representar una variable dependiente para varios individuos o niveles de un factor en función de observacioens realizadas en diferentes tiempos. Además, se pueden incluir modelos para resumir las tendencias observadas en nuestros datos, lo que nos permitirá hacernos una idea de por ejemplo cuál es el resultado de aplicar un determinado tratamiento sobre la variable estudiada. Las posibilidades son casi infinitas.
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)