J'ai un tableau de données avec une colonne représentant une valeur de laboratoire pour chaque sujet d'étude (lignes).
Je veux générer une série d'histogrammes montrant la distribution des valeurs pour chaque test de laboratoire (c'est-à-dire une colonne). Chaque ensemble de valeurs de laboratoire aurait idéalement une largeur de casier différente (certains sont des entiers avec une plage de centaines, d'autres sont numériques avec une plage de 2-3).
Comment je fais ça?
Si vous combinez les packages tidyr
et ggplot2
, vous pouvez utiliser facet_wrap
pour créer un ensemble rapide d'histogrammes de chaque variable dans votre data.frame.
Vous devez modifier la forme de vos données pour qu'elles soient longues avec tidyr::gather
, afin que vous ayez des colonnes key
et value
comme ceci:
library(tidyr)
library(ggplot2)
# or `library(tidyverse)`
mtcars %>% gather() %>% head()
#> key value
#> 1 mpg 21.0
#> 2 mpg 21.0
#> 3 mpg 22.8
#> 4 mpg 21.4
#> 5 mpg 18.7
#> 6 mpg 18.1
En utilisant cela comme nos données, nous pouvons mapper value
comme notre variable x et utiliser facet_wrap
pour séparer par la colonne key
:
ggplot(gather(mtcars), aes(value)) +
geom_histogram(bins = 10) +
facet_wrap(~key, scales = 'free_x')
Le scales = 'free_x'
est nécessaire à moins que vos données ne soient toutes d'une échelle similaire.
Vous pouvez remplacer bins = 10
par tout ce qui correspond à un nombre, ce qui peut vous permettre de les définir un peu individuellement avec un peu de créativité. Vous pouvez également définir binwidth
, ce qui peut être plus pratique, en fonction de l'apparence de vos données. Quoi qu'il en soit, le binning prendra un peu de finesse.
Vous pouvez générer les tracés dans une boucle for avec quelque chose comme ceci, si votre trame de données s'appelle "df" et que vous souhaitez générer des histogrammes commençant par la colonne 2 (si la colonne 1 est votre identifiant):
for (col in 2:ncol(df)) {
hist(df[,col])
}
La fonction hist calcule automatiquement une largeur de bac raisonnable, ou vous pouvez spécifier un nombre fixe de bacs pour tous les histogrammes en ajoutant l'argument break:
hist(df[,col], breaks=10)
Si vous utilisez RStudio, tous vos graphiques seront automatiquement enregistrés dans le volet Graphiques. Sinon, vous devrez enregistrer chaque tracé dans un fichier distinct à l'intérieur de la boucle, comme expliqué ici: http://www.r-bloggers.com/automatically-save-your-plots-to-a-folder/
Je viens de tomber sur la fonction multi.hist () du paquet psych . Il vous permet de tracer rapidement des histogrammes en fonction de colonnes spécifiques et semble vous permettre de définir différentes ruptures pour chaque colonne.