Histogramme polaire sous R

Originales et très visuelles, pensez aux coordonnées polaires pour faire parler vos données

Nous avions vu dans un récent article comment il était possible de superposer plusieurs histogrammes sur un même graphique. Nous allons ici pousser la réflexion plus loin et voir s'il est possible d'obtenir, via la librairie ggplot2 un visuel présentant encore plus d'impact. Pour cela, il va être question, comme vous l'avez compris, de passer notre repère en coordonnées polaires.
Voici ci-dessous, ce à quoi nous voulons arriver :

R histogram histogrammes superposition multiples plusieurs densite polaire polar

Données de travail

Comme pour l'article cité précédemment en référence, nous allons travailler avec le jeu de données reprenant les résultats d'expérimentations d'un laboratoire d'agronomie sur les rendements de diverses variétés de blé. Ce dataset est disponible ici.

Quatre variétés de blé d'hiver sont observées, nous allons, dans le cadre de cet article nous concentrer sur la variété KI133 et, plus précisément, sur les rendements de celle-ci en fonction des conditions d'expérimentation (températures chaudes, medium et froides).

Chargeons nos données dans un dataframe, puis isolons la variété KI133 :


df_ble <- read.table("ble.csv", header = TRUE,
                        sep = ";",
                        quote = "\"",
                        fill = TRUE,
                        comment.char = "")
df_bleKI133 <- df_ble[(df_ble$variete=='KI133'),]
head(df_bleKI133)
     lot semis variete conditions epiaison rendement  sonsMS2
91 S2091     3   KI133     medium  tardive       938 84.06769
92 S2092     4   KI133     medium  tardive       931 83.22687
93 S2093     7   KI133     medium  tardive       931 83.37116
94 S2094     8   KI133     medium  tardive       931 82.77977
95 S2095    11   KI133     medium  tardive       933 82.63052
96 S2096    12   KI133     medium  tardive       931 82.64272
...

Le dataset compte un certain nombre de variables, nous allons ne retenir, pour cet exemple, que le rendement (en g/m2).

Histogramme de base

Avant de passer aux coordonnées polaires, dressons tout d'abord les histogrammes superposés du rendement selon les conditions d'expérimentation. Nous avions détaillé la démarche dans un précèdent article (à lire ici), aussi, nous nous contenterons ici de reproduire le code auquel nous étions arrivés :


histColor <- c("#FC4E07", "#00AFBB", "#E7B800")

ggplot() +
  geom_histogram(data=df_bleKI133, aes(x = rendement, y=..density.., fill = conditions), color='white') +
  ggtitle("Rendement du blé, variété KI133") +
  xlab("Rendement (g/m2)") + ylab("Densité") +
  geom_density(data=df_bleKI133, aes(x = rendement, y=..density.., fill=conditions), alpha=0) +
  scale_fill_manual(values = histColor) +
  theme(
    plot.title = element_text(size=9, hjust = 0.5, face="bold", color="black"),
    axis.title = element_text(size=9)
  )
R histogram histogrammes superposition multiples plusieurs densite polaire polar

Dans le code ci-dessus, rappelons que geom_histogram nous permet de dresser les barres. Le rendement est en abscisses, la fréquence en ordonnées. Via le paramètre fill, nous demandons à ggplot de faire un regroupement par conditions d'expérimentation. Nous avons choisi de gérer les couleurs, c'est pourquoi nous avons ajouté la fonction scale_fill_manual qui pointe sur un vecteur de couleurs histColor.

Nous avons dressé, au-dessus des histogrammes, leur courbe de densité respective. Ici encore, afin d'avoir une courbe distincte par histogramme, il nous a fallu spécifier un regroupement par condition via le paramètre fill. Néanmoins, pour éviter d'avoir une surface pleine sous la courbe, et cacher ainsi les histogrammes, nous avons spécifié un coefficient alpha à 0.

Adaptons à présent ce graphique pour y appliquer des coordonnées polaires.

Histogramme polaire

Comme vous allez le constater, passer en coordonnées polaires se révèle extrêmement simple puisqu'il suffit d'ajouter un appel à la fonction coord_polar(). Il nous faut cependant faire attention à deux choses. La largeur des barres (binwidth), tout d'abord, car, contrairement à un repère cartésien, il est important visuellement parlant que les marques en abscisses soient espacées d'un intervalle régulier. Ensuite, notre second point d'attention portera sur les courbes de densité, que nous voulons plus lisibles.

Afin d'avoir une répartition uniforme des barres sur le cercle, nous allons considérer l'étendue de notre série comme la base de calcul des largeurs de barres.


max <- ceiling(max(df_bleKI133$rendement)/10)
min <- floor(min(df_bleKI133$rendement)/10)
binsize <- max - min

Dressons à présent notre graphique et analysons les différences avec le code de l'histogramme classique.


ggplot() +
  geom_histogram(data=df_bleKI133, aes(x = rendement, y=..density.., fill = conditions), color='white', alpha=0.5, binwidth = binsize) +
  coord_polar() +
  ggtitle("Rendement du blé, variété KI133") +
  xlab("Rendement (g/m2)") + ylab("Densité") +
  geom_density(data=df_bleKI133, aes(x = rendement, y=..density.., color=conditions)) +
  scale_fill_manual(values = histColor) +
  scale_colour_manual(values = histColor) +
  theme(
    plot.title = element_text(size=9, hjust = 0.5, face="bold", color="black"),
    axis.title = element_text(size=9)
  )
R histogram histogrammes superposition multiples plusieurs densite polaire polar

Nous avons spécifié la largeur de barre calculée précédemment via le paramètre binwidth de la fonction geom_histogram. Par ailleurs, comme indiqué, nous avons ajouté un appel à la fonction coord_polar afin de passer le repère en coordonnées polaires. Nous avons conservé la même logique pour les courbes de densité, à ceci près que, cette fois-ci, nous distinguons les conditions non plus par une couleur de remplissage masquée mais par la couleur de la courbe elle-même. C'est en effet plus lisible sur le rendu. Pour arriver à ce résultat, il nous faut gérer nos couleurs et ajouter la fonction scale_colour_manual. Enfin les couleurs étant les mêmes que les histogrammes, nous avons accentué légèrement la transparence de ces derniers via l'option alpha de la fonction geom_histogram.

Conclusion

Les informations présentées sont les mêmes quelque soit le type de repère. Néanmoins, sur le repère en coordonnées polaires, on distingue aisément les masses de rendements en fonction des conditions. L'impact visuel est plus fort et l'effet recherché peut être intéressant lors d'une présentation.


Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !