Archives de
Catégorie : Non classé

Changes in number of authors in ecology journals over time

Changes in number of authors in ecology journals over time

In a post published on Dynamic Ecology last week, Meghan Duffy presented a graph showing the number of authors of articles published in Ecology for the period 1956-2016. [SPOILER: it increases!]. She also noted that someone probably did something similar for the whole field of ecology but couldn’t find it. Neither could I.

I was thinking that it would take a lifetime to collect manually these data (even if I love to spend my time in the dirt of the lab library). But luckily I remembered that I kept a nice dataset of publication records for a good number of journals in ecology. Few years ago, my friend Ivan Mateus and I, scrapped these data to test some scientometric hypotheses. It took several months for us to collect these data, so I’m glad I have the opportunity to use it.

I was in a rush (at the airport on my way to the DNAqua-net kick-off conference) but the R code written 4 years ago to compile the data just worked perfectly! And I could quickly come up with a nice graph. I made some technical choices here: 1/ I deleted some outliers (some rare articles are featuring more than 100 authors!). 2/ I didn’t use a boxplot as Meghan did, because I had data for every year but also because the distribution becomes very skewed with time. 3/ I used a color scale to represent the number of papers, so points act like bins. I could use hexagonal bins to get a continuous surface, but I liked it with points. It just requires a manual tuning for the dot size.

The graph shows the number of authors of articles for 285951 articles published in 113 journals in ecology. It covers the period 1932-2012, but I suspect that data for many journals are missing before 1975. This can explain the sudden change in dots color.

In conclusion, I think this graph does a good job of showing both the increase in the number of paper published every year in our field and the increase in the number of authors per paper. I was expecting this trend but I was really surprised by its strength. And it looks like it’s not going to stop now.

Facebooktwitter
Contours and Networks with epimap and rleafmap

Contours and Networks with epimap and rleafmap

In February, I participated in a hackaton organized by Thibaut Jombart at Imperial College, London, to work on visualization tools for outbreak data. This was a great time spent with great people! Thanks again, Thibaut, for organizing. I took part in the development of epimap, an R package for statistical mapping. The aim of epimap is to provide tools to quickly and efficiently visualize spatial data. There is a set of functions designed to do that and you can check out the Github page for a demo.

This package also provides two functions to coerce complex objects to Spatial classes so that they can be easily included in a map.

  • The contour2sp function takes a SpatialGrid object and returns contour lines as a SpatialLinesDataFrame.
  • The graph2sp function takes a graph (from igraph package) with geolocated vertices and returns a list of Spatial objects (points and lines).

Following this post of Arthur Charpentier (who nicely plays with rleafmap!), I decided to include the John Snow’s Cholera dataset in epimap so it can be simply used for tests.

In this post I want to show how epimap and rleafmap can be combined to create fully customizable interactive maps with complex objects. The cholera dataset gives the locations of cholera deaths and the locations of water pumps in London. The maps will show the location of cholera deaths with points, the local density of deaths with colored contour lines and the location of water pumps with icons. Moreover, the pumps will be represented within a network where two pumps are connected if there are close enough.

library(rleafmap)
library(epimap)

data(cholera)

# Create a network of pumps
pump.adj <- as.matrix(dist(sp::coordinates(cholera$pumps)))
pump.graph <- graph.adjacency(pump.adj < 0.003, diag = FALSE)
V(pump.graph)$lat <- coordinates(cholera$pumps)[, 2]
V(pump.graph)$lon <- coordinates(cholera$pumps)[, 1]

# Convert death density SpatialGrid to contour SpatialLines
death.cont <- contour2sp(cholera$deaths.den, nlevels = 10)

# Basemap layer
cdbdark.bm <- basemap("cartodb.darkmatter.nolab")

# Data layers
death.points <- spLayer(cholera$deaths,
                        size = 1,
                        fill.col =  "white",
                        fill.alpha = 0.5,
                        stroke = FALSE)
death.contour <- spLayer(death.cont,
                         stroke.col = heat.colors(12)[cut(death.cont$level, 12)],
                         stroke.lwd = 1.5,
                         stroke.alpha = 1)
pumps.points <- spLayer(graph2sp(pump.graph)[[1]],
                        png = "/home/francois/water.png",
                        png.width=31 ,
                        png.height=31)
pumps.links <- spLayer(graph2sp(pump.graph)[[2]],
                       stroke.lwd = 3,
                       stroke.col = "white")

my.ui <- ui(layers = "topright")

writeMap(cdbdark.bm, death.points, death.contour,
         pumps.links, pumps.points, interface = my.ui)

And here is the map we get:

Facebooktwitter
Notifications planifiées sur Ubuntu

Notifications planifiées sur Ubuntu

Au travail nous sommes à présent tenus de badger quatre fois par jour via une interface web. Je ne reviendrai pas ici sur tout le mal que je pense de la badgeuse. Le problème à présent est de composer avec ce système et de ne pas oublier de badger alors qu’on a mille choses plus intéressantes à l’esprit. D’où l’idée d’utiliser le système de notification d’Ubuntu dans une tache cron, pour s’envoyer des petits messages de rappels.

On commencera par installer le paquet libnotify-bin.
sudo apt-get install libnotify-bin

Pour ajouter une tache planifiées on édite le fichier crontab.
crontab -e

Et on y ajoute autant de tache qu’on veut (exemple d’utilisation ici)
Dans notre cas, pour s’envoyer un petit message chaque jour à 8:30 on peut mettre :
30 8 * * * DISPLAY=:0 notify-send -u critical -i /usr/share/icons/gnome/256x256/emotes/face-wink.png "Salut, as-tu pensé à badger?"

Et voilà !
Sélection_038

Facebooktwitter
RZH, une macro VBA Excel pour la délimitation de zones humides

RZH, une macro VBA Excel pour la délimitation de zones humides

Ce billet est l’occasion de présenter et de relacher dans la nature un petit programme VBA (hemhem…) pour faciliter la saisie et la synthèse de données dans le cadre de la délimitation administrative de zones humides sur critères botaniques. Autant dire tout de suite que ça s’adresse à un public plutôt restreint mais il en faut pour tout les goûts.

Zieg3rman on Flickr (CC BY-NC-SA)
Zieg3rman on Flickr (CC BY-NC-SA)

Le programme en lui même est relativement simple,je recommande néanmoins aux utilisateurs de bien veiller à ce que tout fonctionne bien selon leurs attentes, car je n’ai pas fait 36.000 tests…

RZH est distribué sous licence libre GPL, toutes les sources sont disponibles via l’éditeur VBA de Excel.

>>> Télécharger RZH

Je reproduit ci-dessous l’aide, plutôt réduite j’en conviens, mais qui donne un premier aperçu du programme.

1. A PROPOS DE RZH

RZH est une application intégrée à Microsoft Excel conçue pour faciliter la saisie et la synthèse de données dans le cadre de la délimitation de zones humides sur critères botaniques.

RZH s'appuie sur l'Arrêté du 24 juin 2008 précisant les critères de définition et de délimitation des zones humides en application des articles L. 214-7-1 et R. 211-108 du code de l'environnement français. Cependant RZH n'est pas reconnu par la législation et est fourni sans aucune garantie (Voir Licence).

2. RECOMMANDATIONS RELATIVES A CETTE VERSION

RZH est en développement et des bugs sont susceptibles de survenir. Pour vous en prévenir, il est conseillé d'utiliser uniquement les assistants de RZH pour saisir et supprimer des données.

De manière générale il est recommandé de ne pas modifier manuellement la structure du classeur et de ne pas l'annoter si vous ne comprenez pas le fonctionnement interne de l'application.

Une fois les tableaux générés vous pouvez les copier dans un autre classeur où vous pourrez les modifier à loisir.

3. UTILISATION DE RZH

RZH fonctionne en quatre étapes
- Génération d'un nouveau projet
- Construction d'une base de données espèces
- Saisie des données de terrain
- Synthèse

3.1 INITIALISATION D'UN NOUVEAU PROJET

Un nouveau projet est généré avec le bouton "Initialiser un nouveau projet" disponible dans l'onglet "Start".
Cette action entraîne la perte de tout projet antérieur présent sur ce document.
L'assistant vous permet de saisir le nombre de transect pour ce projet et pour chaque transect le nombre de placettes désiré.
A la fin de cette étape, les onglets résultats (un par transect) sont générés.

3.2 BASE DE DONNEES ESPECES

Avant de saisir les résultats, il convient de compléter la base de données espèces. Cette base doit contenir toutes les espèces recensées sur le projet. Elle peut en contenir plus.
Cliquez sur l'onglet "BD Espèces" pour consulter la base. Utilisez les boutons modifier la base.
Il peut être intéressant de transférer la base d'un projet à l'autre. Pour cela, un simple Copier-Coller suffit.
La base de données n'est pas effacée lors de l'initialisation d'un projet.

3.3 SAISIE DES DONNEES TERRAIN

Les données collectées sur le terrain peuvent être saisies et supprimées sur chaque onglet transect en utilisant les boutons et assistants dédiés.

3.4 SYNTHESE DES DONNEES

L'onglet "Synthèse" permet de générer un tableau de synthèse des résultats et de caractériser la végétation de chaque placette (hygrophile ou non).
La synthèse se met à jour automatiquement si des changements sont faits dans les résultats.

Facebooktwitter
Convertir un tableau R vers Javascript

Convertir un tableau R vers Javascript

Pour un petit projet sur lequel je travaille, j’ai eu besoin de passer des données d’un dataframe de R vers Javascript. Les données en Javascript peuvent être chargées au format JSON que R exporte avec le package RJSON. Mais pour ce projet particulier, dans un souci de simplicité et parce que je débute en Javascript, je voulais importer mes données dans le format traditionnel des arrays de Javascript.

Un array en JS ça marche comme ça :

var montableau = [1, 2, 3, 4];

Ce qui équivaut grosso modo à un vecteur sous R :

montableau <- c(1, 2, 3, 4)

On peut aussi faire de la pseudo-2D :

var montableau = [[1, 2], [3, 4]];

Ce qui donnerai une matrice sous R :

montableau <- matrix(c(1, 2, 3, 4), ncol=2, byrow=TRUE)

Bref voici une petite fonction R pour passer un dataframe (ou un truc ressemblant) de R vers Javascipt :

toJSarray <- function(df){

  if (!is.data.frame(df)){
    df <- as.data.frame(df)
  }
  
  df.nbli <- dim(df)[1]
  df.nbco <- dim(df)[2]
  temp <- vector()
  a.1 <- vector()
  
  for (i in 1:df.nbli){
      for (j in 1:df.nbco){
          if (is.numeric(df[,j])){
            a.1[j] <- df[i,j]
          } else {
            a.1[j] <- paste("\"", df[i,j], "\"", sep="")   
          }
      }
      a.2 <- paste(a.1, collapse=", ")
      temp[i] <- paste ("[", a.2, "]", sep="")
  }
  
  temp.2 <- paste(temp, collapse=", ")
  if (df.nbli == 1){
    jsarr <- temp.2
  } else {
    jsarr <- paste ("[", temp.2, "]", sep="")
  }
  invisible(jsarr)
}

Après quoi on peut rapidement écrire un fichier JS contenant nos données.

write(paste("var montableau = ", toJSarray(mondf), sep=""), "monfichier.js")

Facebooktwitter
POC devient POK

POC devient POK

La première des bonnes résolutions qui vient à l’esprit d’un bloggeur à l’aube d’une nouvelle année c’est surement d’écrire plus d’article. Mais je sais que je ne pourrai jamais tenir une telle promesse car les mois à venir vont être bien chargés.

Pour me mettre un peu de pression je vient de faire l’acquisition du nom de domaine pieceofk.fr et j’ai mis à jour le header dans la foulée. En avant pour 2013 !

Facebooktwitter