2 votes

Tracer un graphique x-y avec les erreurs sous forme de courbes gaussiennes/normales (idéalement en R)

J'ai des données x-y, qui ont toutes deux des erreurs +/- (qui sont égales de chaque côté). Le type de données dont il s'agit présente une distribution normale, dans les deux directions x-y. Pour l'instant, nous les traçons soit sous la forme de croix x-y typiques, soit en utilisant geom_rect(), mais ces deux méthodes ne permettent pas de montrer ce que les données représentent. Je cherche une solution qui permettrait à chacun des points de données x-y d'être représenté comme une sorte de distribution normale/gaussienne (au lieu de simplement +), comme dans mon croquis ci-dessous.

x-y plot with normal distributions for both errors

Vous trouverez ci-dessous un exemple de cadre de données.

structure(list(Age = c(2003L, 1999L, 1995L, 1993L, 1993L, 1990L, 1988L, 1987L, 1985L, 1984L, 1983L, 1975L, 1974L, 1972L, 1963L, 1960L, 1959L, 1957L, 1953L, 1951L, 1951L, 1946L, 1940L, 1936L, 1930L, 1927L, 1919L, 1914L, 1906L, 1885L, 1864L, 1842L, 1830L, 1810L, 1803L, 1783L, 1762L, 1741L, 1720L, 1699L, 1678L, 1657L ), Age_error = c(1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 4L, 2L, 2L, 2L, 3L, 5L, 3L, 3L, 4L, 6L, 4L, 8L, 5L, 7L, 5L, 10L, 14L, 17L, 23L, 21L, 20L, 53L, 67L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L), Valeur = c(0, 0,07, 0, 0,09, 0,02, 0,06, -0,02, 0,154, 0.05, 0.02, -0.03, -0.024, -0.01, -0.06, -0.15, -0.04, 0.065, -0.1, -0.09, -0.02, -0.024, -0.11, -0.081, -0.13, -0.12, -0.07, -0.16, -0.122, -0.057, -0.18, -0.095, -0.105, -0.23, -0.19, -0.178, -0,267, -0,26, -0,158, -0,079, -0,218, -0,148, -0,193), Valeur_erreur = c(0,17, 0.143, 0.18, 0.18, 0.17, 0.19, 0.18, 0.163, 0.19, 0.18, 0.18, 0.142, 0.17, 0.18, 0.17, 0.17, 0.152, 0.17, 0.17, 0.17, 0.151, 0.17, 0.154, 0.17, 0.18, 0.26, 0.17, 0.144, 0.145, 0.18, 0.153, 0.153, 0.17, 0.18, 0.144, 0.155, 0.138, 0.141, 0.157, 0.14, 0.147, 0.137)), .Names = c("Age", "Age_error", "Value", "Value_error"), class = "data.frame", row.names = c(NA, -42L))

C'est le type de code que j'utilise pour obtenir un graphique d'erreur x-y typique pour ce cadre de données.

ggplot() + geom_linerange(data=mydata, aes(y=Value, x=Age, xmin=Age-Age_error, xmax=Age+Age_error, ymin=Value-Value_error, ymax=Value+Value_error)) + geom_errorbarh(data=mydata, aes(y=Value, x=Age, xmin=Age-Age_error, xmax=Age+Age_error, ymin=Value-Value_error, ymax=Value+Value_error)) 

Je n'ai pas encore trouvé de fonction permettant de faire des tracés de type distribution normale x-y et il n'y en a peut-être pas, mais j'ai pensé que quelqu'un pourrait avoir des idées ! Merci d'avance.

0voto

BondedDust Points 105234

Voulez-vous un tracé de contour de l'âge en fonction de la valeur sous forme de densité de noyau 2d ?

require(MASS)
dens <- with(dat, MASS::kde2d(Age, Value))
str(dens)
#-------------
List of 3
 $ x: num [1:25] 1657 1671 1686 1700 1715 ...
 $ y: num [1:25] -0.267 -0.249 -0.232 -0.214 -0.197 ...
 $ z: num [1:25, 1:25] 0.00152 0.00187 0.00226 0.00267 0.00312 ...
#--------------
# kde2d is designed for contour display: x-vector, y-vector, z-Matrix
 contour(dens)

J'ai ajouté les points de données pour que le lien entre le tracé de contour et les données soit plus visible :

 points(dat$Age, dat$Value, cex=0.3, col="red")

enter image description here

0voto

akash87 Points 1399

Si vous avez besoin que chaque paire Age,Value ait une erreur +v et -v, alors je pense que vous devez rechercher smoothScatter fonction. Cette fonction trace les densités de chaque point en utilisant un schéma de couleurs qui s'estompe à mesure que l'on s'éloigne du point.

smoothScatter(mydata$Age, mydata$Value)

Résultats en

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X