1  Statistiques production HAL pour l’HCERES

2 Les membres de l’UMR IDEES par champs

2.1 Les membres de l’UMR

Code
umr_simple=read_csv("data/personnel_umr_lite.csv") %>%
  filter(axe1 !="Appui") 

umr_autre=umr_simple %>% filter(is.na(sous_champ))
paper_autre=paper %>% 
  inner_join(umr_autre) %>%
  count(nom_simple) %>%
  arrange(desc(n)) %>%
  pull(nom_simple) 
# au moins une publi
umr_simple=umr_simple %>% 
  filter(!is.na(sous_champ)) %>%
  bind_rows(
    umr_simple %>% filter(nom_simple %in% paper_autre)
  ) %>%
  distinct()
  # repartition des champs 
umr_simple=umr_simple %>% mutate(sous_champ=ifelse(is.na(sous_champ),"A",sous_champ))%>%
  
  mutate(sous_champ1=str_split_i(sous_champ,";",1) %>% unlist() %>% str_trim(),
         sous_champ2=str_split_i(sous_champ,";",2) %>% unlist() %>% str_trim()) %>%
  mutate(champ1=substr(sous_champ1,stop = 1,start = 0),
         champ2=substr(sous_champ2,stop = 1,start = 0))


DT::datatable(umr_simple,options=list(pageLength = 5))

A noter la présence d’une variable “nom_simple”, qui consiste en la première lettre du prenom et le nom complet, en minuscule. Il servira de jointure avec les identifiants hal, mais ceci fera l’objet d’un document ultérieur.

2.2 Les champs et sous champs de l’UMR

Code
rosette_champs=data.frame(
  champs=c("R","M","G","D","P","A"),
  label_champs=c("Risque","Modélisation",
                 "Géo-archéologie",
                 "Dynamiques et transition des territoires",
                 "Recherche portuaire et maritime",
                 "Autre")) %>%
  mutate(label_champs=factor(label_champs,levels=label_champs))


rosette_champs_long=
  data.frame(
    sous_champ_num=c("R1","R2","R3","R4",
                     "M1","M2","M3",
                     "G1","G2",
                     "D1","D2","D3",
                     "P1","P2",
                     "A"
    ),
    sous_champ_long=c(
      "Risques et populations",
      "Santé environnement",
      "Adaptation au changement climatique (Ville & Agriculture)",
      "Vulnérabilités & adaptation des espaces côtiers",
      "Dynamiques et aménités environnementales de la parcelle au bassin versant" ,
      "Développement de modèles statistiques complexes pour l'analyse de phénomènes géographiques",
      "Modélisation lois d'échelles urbaines",
      "Analyse spatiale de la circulation des archéomatériaux",
      "Reconstitution des paysages et environnements du passé",
      "Analyse géographique des transitions territoriales (acteurs, discours, diagnostics et processus)",
      "Dynamiques de population",
      "Transition numérique",
      "Dynamiques maritimes et portuaires",
      "Histoire Maritime et Portuaire",
      "Autre"
    ),
    sous_champ=c(
      "Risques et populations",
      "Santé environnement",
      "Adaptation au changement climatique",
      "Vulnérabilités & adaptation\ndes espaces côtiers",
      "Dynamiques et aménités environnementales\nde la parcelle au bassin versant" ,
      "Modèles statistiques complexes\npour l'analyse de phénomènes géographiques",
      "Modélisation lois d'échelles urbaines",
      "Analyse spatiale de la\ncirculation des archéomatériaux",
      "Reconstitution des paysages\net environnements du passé",
      "Analyse géographique\ndes transitions territoriales",
      "Dynamiques de population",
      "Transition numérique",
      "Dynamiques maritimes et portuaires",
      "Histoire Maritime et Portuaire",
      "Autre"
    ),
    champ=c(
      rep("Risque",4),
      rep("Modélisation",3),
      rep("Géo-archéologie",2),
      rep("Dynamiques et transition des territoires",3),
      rep("Recherche portuaire et maritime",2),
      "Autre"
      
    )) %>%
  mutate(champ=factor(champ,levels=unique(champ))) %>%
  mutate(champs_num=substr(x = sous_champ_num,0,1))

DT::datatable(rosette_champs_long,options=list(pageLength = 5))

2.3 Répartition des effectifs par champs

Ici nous avons fait le choix de comptabiliser les personnes inscrites dans plusieurs champs, soit 20 personnes.

Code
sous_champ=umr_simple %>% 
  # mutate()
  count(sous_champ1) %>%
  rename(sous_champ_num=sous_champ1) %>%
  bind_rows(
    umr_simple %>% 
      count(sous_champ2) %>%
      rename(sous_champ_num=sous_champ2)
  ) %>%
  group_by(sous_champ_num) %>%
  summarise(n=sum(n)) %>%
  ungroup() %>%
  inner_join(rosette_champs_long,by=c("sous_champ_num"="sous_champ_num")) %>%
  mutate(sous_champ_fact=factor(sous_champ,levels=rosette_champs_long$sous_champ)) %>% mutate(sous_champ=gsub("\n","",sous_champ)) %>%
  filter(!is.na(sous_champ_num))


sous_champ=sous_champ %>%
  mutate(nb_tot=sum(n)) %>%
  mutate(nb_tot2=nb_tot-n[sous_champ_num=="A"]) %>%
  group_by(champ) %>%
  mutate(nb_champ=sum(n)) %>%
  ungroup() %>%
  mutate(pc_sous_champs=round(100*n/nb_champ)) %>%
  mutate(pc_champ_all=round(100*nb_champ/nb_tot),
         pc_champ=round(100*nb_champ/nb_tot2))
  # mutate(n2=sum(n[sous_champ_num!="A"],na.rm=TRUE))

pal=c(RColorBrewer::brewer.pal(5,"Set1"),"Yellow")
names(pal)=rosette_champs$label_champs

champ_stat=sous_champ %>%
  dplyr::select(champ,nb_champ,pc_champ,pc_champ_all) %>%
  distinct() 

fun_plot_champ=function(x){
  x %>%
  ggplot(aes(x=""))+
  geom_col(aes(fill=reorder(champ,-pos),y=nb_champ),
           stat="identity")+
  geom_text(aes(label=label,y=pos))+
  # coord_polar()+
  coord_polar("y",start=0)+
  scale_fill_manual(values=pal,name="Champs")+
  theme_bw(base_size = 10)+
  xlab("")+
  ylab("")
}
Code
champ_stat %>%
  arrange(nb_champ) %>%
  mutate(pos=cumsum(nb_champ)-nb_champ/2) %>%
  mutate(label=paste0(pc_champ_all,"% / n=",nb_champ)) %>%
  fun_plot_champ()

Code
ggsave("figures/fig_1.svg",device = svglite::svglite)
Code
champ_stat%>% dplyr::select(-pc_champ) %>%
  # filter(champs != "Autre") %>%
  download_this(
    output_name      = "stat_champ_all",
    output_extension = ".csv",
    button_label     = "Télécharger la base de données (CSV)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
champ_stat %>% 
  filter(champ != "Autre") %>%
  arrange(nb_champ) %>%
  mutate(pos=cumsum(nb_champ)-nb_champ/2) %>%
  mutate(label=paste0(pc_champ,"% / n=",nb_champ)) %>%
  fun_plot_champ()

Code
ggsave("figures/fig_2.svg",device = svglite::svglite)
Code
champ_stat%>%
    filter(champ != "Autre") %>% 
  dplyr::select(-pc_champ_all) %>%
  download_this(
    output_name      = "stat_champ",
    output_extension = ".csv",
    button_label     = "Télécharger la base de données (CSV)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

2.4 Répartition des effectifs par champs & sous champs

Code
sous_champ2=sous_champ %>%
  dplyr::select(-nb_tot2) %>%
  filter(!is.na(sous_champ)) %>%
  filter(champ != "Autre") %>%
  mutate(nb_tot=sum(n)) %>%
  group_by(champ) %>%
  mutate(nb_champ=sum(n)) %>%
  ungroup() %>%
  mutate(pc_sous_champs=round(100*n/nb_champ)) %>%
  mutate(pc_champ=round(100*nb_champ/nb_tot))
Code
sous_champ2 %>%
  ggplot()+
  geom_col(aes(x=sous_champ_fact,y=n,fill=champ))+
  geom_text(aes(x=sous_champ_fact,y=n,label=n))+
  scale_fill_manual(values =pal,name="Champs")+
  ylab("Effectif")+
  xlab("Sous Champs")+
  theme_bw(base_size=15)+
  theme(axis.text.x = element_text(angle=45,hjust=1,vjust=1),
        legend.position = c(0.25,0.7),
        plot.margin = margin(l=80,b=100))

Code
ggsave("figures/fig_3.svg",device = svglite::svglite)
Code
sous_champ2 %>%
  dplyr::select(
    champ,
    sous_champ_num,
    sous_champ_long,
    n,
    nb_champ,
    pc_champ,
    pc_champ_all,
    pc_sous_champs
    ) %>%
  arrange(champ,sous_champ_num) %>%
  download_this(
    output_name      = "stat_sous_champ_all",
    output_extension = ".csv",
    button_label     = "Télécharger la base de données (CSV ;)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

3 Généralités sur les productions de l’UMR

3.1 Les données en entrée

Code
# les papiers 
paper=read_csv("data/all_paper_umr_20260717.csv")
rosette=read_csv("data/rosette_hal_formid_nom.csv")

La base HAL de l’UMR au 17/07/2026 contient 4389 Documents, pour 1638 auteurs.

Code
DT::datatable(paper,options=list(pageLength = 5))
Code
paper %>%
  download_this(
    output_name      = "all_paper_umr_20260717",
    output_extension = ".csv",
    button_label     = "Télécharger la base HAL (CSV ;)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

Comme on peut le voir ici, il y aussi une colonne nom_simple. Il s’agit d’un identifiant unique pour toutes les personnes dans la base des productions de l’UMR, qu’elles soient membre ou non du Labo. Si vous ouvrez le code plus haut, un fichier rosette a également été chargé. Il permet de faire le lien entre les différents identifiants hal et l’identifiant unique nom_simple.

Juste pour vous montrer, vous trouverez ci-dessous un échantillon ici pris aléatoirement de membres du labo entre 2020 et 2025, avec plusieurs identifiant hal. C’était un casse tête à gérer.

Code
sample_people=rosette %>% count(nom_simple) %>% 
  filter(nom_simple %in% umr_simple$nom_simple) %>%
  arrange(desc(n)) %>% 
  filter(n>3) %>% pull(nom_simple) %>% sample(3)
rosette %>%
  filter(nom_simple %in% sample_people) %>%
  arrange(nom_simple) %>%
  datatable(options=list(pageLength = nrow(.)))
Code
rosette %>% count(nom_simple,name = "Nombre d'identifiants") %>%
  arrange(desc(`Nombre d'identifiants`))%>%
    datatable(options=list(pageLength = 5))

3.2 Production sur la période 2020-2026

Code
url_doc="https://api.archives-ouvertes.fr/ref/doctype"
type_doc=fromJSON(url_doc)
type_doc=type_doc$response$result$doc$str 
type_doc=do.call("rbind.data.frame",type_doc) %>%
  setNames(c("docType_s","type"))

paper_type=paper %>%
  dplyr::select(halId_s,docType_s) %>%
  distinct()

count_type=paper_type %>%
  count(docType_s) %>%
  left_join(type_doc) %>%
  arrange(desc(n)) %>%
  mutate(type=ifelse(n<10,"Autre",type)) %>%
  mutate(type=ifelse(docType_s=="OTHER","Autre",type)) %>%
  mutate(type=ifelse(docType_s=="COMM" | 
                       docType_s=="POSTER" |
                       docType_s =="PROCEEDINGS","Communication/Poster",
                     type)) %>%
  mutate(type2=gsub(x = type,"[/]","\n"))%>%
  mutate(type2=gsub(x = type2,",","\n")) %>%
mutate(type2=gsub(x = type2," ou","\nou"))
Code
count_type %>%
group_by(type) %>%
  summarise(n=sum(n)) %>%
  arrange(desc(n)) %>%
  ggplot(aes(x=reorder(type,n),y=n))+
  geom_col()+
  geom_label(aes(label=n))+
  theme_bw(base_size=12)+
  theme(axis.text.x = element_text(angle=45,hjust=1))+
  xlab("")+
  ylab("Nombre de production")

Code
ggsave("figures/fig_4.svg",device = svglite::svglite)
count_type %>%
  dplyr::select(-type2) %>%
  download_this(
    output_name      = "labo_production",
    output_extension = ".csv",
    button_label     = "Télécharger la base HAL (CSV ;)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

Ici on ne va prendre que le premier champs de chaque membre du labo. Si deux personnes d’un même champs ont publié ensemble, cette publi vaudra 1 dans le champs. Si ces personnes sont d’un champs différent, chaque champs aura +1.

Code
paper_champ=paper %>% 
    dplyr::select(halId_s,nom_simple,producedDateY_i,docType_s) %>% 
    inner_join(umr_simple,by="nom_simple")
count_type_champ=paper_champ %>%
  dplyr::select(halId_s,champ1,docType_s) %>%
  distinct() %>%
  count(champ1,docType_s) %>%
  inner_join(count_type %>% dplyr::select(-n),by="docType_s") %>%
  inner_join(rosette_champs,by=c("champ1"="champs"))
tot_publi_champ=count_type_champ %>%
  group_by(label_champs) %>%
  summarise(nb=sum(n))
Code
count_type_champ %>%
  group_by(type,label_champs) %>%
  summarise(n=sum(n)) %>%
  arrange(desc(n)) %>%
  ggplot(aes(x=reorder(type,n),y=n))+
  geom_col()+
  geom_label(aes(label=n))+
  theme_bw(base_size=16)+
  theme(axis.text.x = element_text(angle=45,hjust=1))+
  geom_text(data=tot_publi_champ,
            aes(x=-Inf,y=Inf,label=paste0("Total=",nb)),
            hjust = -1,
            vjust=3)+
            # vjust=0)+
  xlab("")+
  ylab("Nombre de production")+
  facet_wrap(~label_champs,scale="free_y",ncol=2)

Code
ggsave("figures/fig_5.svg",device = svglite::svglite)

count_type_champ %>%
  dplyr::select(-type2) %>%
  download_this(
    output_name      = "labo_production_champs",
    output_extension = ".csv",
    button_label     = "Télécharger la base HAL (CSV ;)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
people_hors_champs=paper_champ %>% filter(champ1=="A") %>% left_join(type_doc)

people_hors_champs %>% count(nom_simple) %>% arrange(desc(n)) %>% 
  datatable(options=list(pageLength = 5))
Code
people_hors_champs %>% count(type,nom_simple) %>% arrange(desc(n)) %>%
  group_by(nom_simple) %>%
  mutate(tot=sum(n)) %>%
  ungroup() %>%
  ggplot()+
  geom_col(aes(x=reorder(nom_simple,tot),y=n,fill=type))+
  theme_bw()+
  # scale_fill_brewer(palette="Set2")+
  theme(axis.text.x = element_text(angle=45,hjust=1))

Code
ggsave("figures/fig_6.svg",device = svglite::svglite)

3.3 Les co-auteurs

Code
sel_type=count_type %>% 
               group_by(type) %>% 
               summarise(nb=sum(n))%>%
              filter(nb>100) %>% pull(type)
count_type2=count_type %>% filter(type %in% sel_type) %>%
  dplyr::select(-n)

nb_coauth=paper %>% count(halId_s,name="nb_coauth")
nb_coauth_champ=paper %>%
  dplyr::select(halId_s,nom_simple,docType_s) %>%
  inner_join(nb_coauth) %>%  # nombre de coauteurs par articles
  inner_join(umr_simple %>% dplyr::select(nom_simple,champ1),
             by="nom_simple") %>%  # on récupère les champs
  left_join(rosette_champs,by=c("champ1"="champs"))%>%
  dplyr::select(-nom_simple) %>%
  distinct()
nb_coauth_champ_article=nb_coauth_champ %>%
  inner_join(count_type2,by="docType_s") 

stat_coauth_champs_art=nb_coauth_champ_article %>%
  group_by(label_champs,type) %>%
  summarise(nb_prod=n(),
            mean=mean(nb_coauth),
            median=median(nb_coauth),
            sd=sd(nb_coauth),
            min=min(nb_coauth),
            max=max(nb_coauth)) %>% 
  ungroup()
stat_coauth_champ=nb_coauth_champ %>%
  group_by(label_champs) %>%
  summarise(nb_prod=n(),
            mean=mean(nb_coauth),
            median=median(nb_coauth),
            sd=sd(nb_coauth),
            min=min(nb_coauth),
            max=max(nb_coauth)) %>% 
  ungroup()
Code
  # summarise(nb=sum(n))
nb_coauth_champ_article %>%
  ggplot(aes(y=nb_coauth,x=type))+
  geom_boxplot(aes(fill=type),outliers = FALSE)+
  facet_wrap(~label_champs,scale="free_y")+
  ggtitle("nombre de co-auteurs")+
  ylab("Nombre de co-auteurs")+
  xlab("")+
  theme_bw(base_size = 14)+
  theme(axis.text.x = element_text(angle=45,hjust=1),
        legend.position="bottom",
        legend.direction = "horizontal")

Code
ggsave("figures/fig_7.svg",device = svglite::svglite)
Code
nb_coauth_champ_article %>%
  ggplot(aes(y=nb_coauth,x=label_champs))+
  geom_boxplot(aes(fill=label_champs),outliers = FALSE)+
  facet_wrap(~type,scale="free_y")+
  ggtitle("nombre de co-auteurs par type de document")+
  theme_bw(base_size = 16)+
  theme(legend.position = "none",
        axis.text.x = element_text(angle=45,hjust=1))+
  ylab("Nombre de coauteurs")+
  xlab("")

Code
ggsave("figures/fig_8.svg",device = svglite::svglite)
Code
stat_coauth_champ %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "stat_production_champs",
    output_extension = ".csv",
    button_label     = "stats auteurs par champs",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
stat_coauth_champs_art %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "stat_production_champs_prod",
    output_extension = ".csv",
    button_label     = "stats auteurs par champs & type de production",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

4 Les principales revues

Code
journal=read_csv("data/journal_ART_ISSUE_info.csv") %>%
  mutate(nom_cours=str_split_i(journalTitle_s,":",1) %>% unlist() %>%
           str_trim()) %>%
    mutate(nom_cours=gsub("[/]","\n",nom_cours) %>% unlist() %>%
           str_trim()) %>%
    mutate(nom_cours=ifelse(grepl("TransNav",nom_cours),"TransNav",nom_cours)) %>%
  mutate(nom_cours=gsub("International","Int.",nom_cours))

main_paper=paper %>%
  dplyr::select(halId_s,nom_simple) %>%distinct() %>%
  filter(nom_simple %in% umr_simple$nom_simple) %>%
  dplyr::select(halId_s) %>% distinct() %>%
  inner_join(journal %>% dplyr::select(halId_s,nom_cours)) %>%
  count(nom_cours) %>%
  arrange(desc(n))


p_tmp=main_paper %>%
     slice(1:50) %>%
   ggplot()+
  geom_col(aes(y=reorder(nom_cours,n),x=n))+
  theme_bw()+
  # theme(axis.text.x = element_text(angle=45,hjust=1))+
  ggtitle("les 50 principales revues")+
  xlab("Revues")+
  ylab("Nombre de publis")
ggplotly(p_tmp)
Code
ggsave("figures/fig_9.svg",device = svglite::svglite)

main_paper %>%
    slice(1:100) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_acl",
    output_extension = ".csv",
    button_label     = "les 100 principales revues",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
  # 

On ne prend que le champs principal. Si plusieurs personnes sont du même champs dans une revue, ils comptent pour un seul.

Code
hal_champ=paper %>%
  dplyr::select(halId_s,nom_simple) %>%
  inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
  inner_join(rosette_champs,by=c("champ1"="champs")) %>%
  dplyr::select(halId_s,label_champs) %>%
  distinct() 
  # count(halId_s,label_champs)

# journal %>% 
#   filter(nom_cours=="Geomorphology") %>%
#   dplyr::select(halId_s) %>%
#   inner_join(paper) %>%
#   inner_join(umr_simple) %>%
#   filter(champ1=="A")

acl_champs_stat=hal_champ %>%
  inner_join(journal %>% dplyr::select(halId_s,nom_cours)) %>%
  count(label_champs,nom_cours) %>%
  arrange(desc(n))
main_acl_champs_stat=acl_champs_stat %>%
  # filter(n>2) %>%
  group_by(label_champs) %>%
  arrange(desc(n)) %>%
  slice(1:10) %>%
  ungroup()

main_acl_champs_stat %>%
  ggplot()+
    geom_col(aes(x=reorder(nom_cours,n),y=n))+
    facet_wrap_color(vars(label_champs),nrow=3,ncol=2,#lab_colors="auto",
                   colors=pal,scale="free") +
  theme_bw()+
  theme(axis.text.x = element_text(angle=45,hjust=1))+
  ggtitle("les 10 principales revues par champs")+
  xlab("Revues")+
  ylab("Nombre de publis")

Code
ggsave("figures/fig_10.svg",device = svglite::svglite)



main_acl_champs_stat %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_acl_champs",
    output_extension = ".csv",
    button_label     = "les 10 principales revues par champs",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

5 Les productions inter-labo

5.1 préambule

Des publications hal, nous avons récupéré la “facet” avec le numéro du labo de chaque co-auteur. Bien entendu, ce dernier n’est pas forcément renseigné. Néanmoins, on a ensuite interrogé l’API HAL : https://api.archives-ouvertes.fr/ref/structure/?q=[id_labo]&fl=name_s,address_s,country_s,ror_s,docid,acronym_s pour obtenir quelques infos sur les labos, notamment leur nom et sigle, et bien entendu des infos sur la géolocalisation (l’adresse, le pays et le lien vers le RoR)

Code
labo=read_csv("data/info_all_lab_structure.csv") %>%
  filter(!is.na(country_s)) %>%
  mutate(labo_name=ifelse(is.na(acronym_s),name_s,acronym_s)) %>%
  mutate(labo_name=ifelse(labo_name=='EREN [CRESS - U1153 / UMR_A 1125]',"EREN",labo_name),
         labo_name=ifelse(labo_name=='PRODIG (UMR_8586 / UMR_D_215 / UM_115)',"PRODIG",labo_name),
         labo_name=ifelse(labo_name=='Écologie et Émergence des Pathogènes Transmis par les Arthropodes / Ecology and Emergence of Arthropod-borne Pathogens',
                     "Institut Pasteur, Paris",labo_name),
         labo_name=ifelse(labo_name=="GC (UMR_8504)","Géographie-Cité",labo_name),
         labo_name=ifelse(labo_name=="Métis Lab EM Normandie","Métis Lab",labo_name),
         labo_name=ifelse(labo_name=="UMR 228 Espace-Dev, Espace pour le développement",
                     "UMR 228 Espace-Dev",labo_name)) %>%
    mutate(labo_name=ifelse(grepl("LITIS",labo_name),"LITIS",labo_name)) %>%
  mutate(labo_name=str_split_i(pattern = " = ",labo_name,1) %>% unlist)


rosette_lab=labo %>% dplyr::select(labo_name,name_s,labo_id) %>%
  distinct()

datatable(labo,options=list(pageLength = 5))

5.1.1 Des laboratoires avec plusieurs identifiants (multisite)

Code
list_labo_multiple=labo %>% dplyr::select(labo_id,labo_name) %>%
  distinct() %>%
  count(labo_name) %>%
  arrange(desc(n)) %>%
  filter(n>1) %>%
  pull(labo_name)

labo %>%
  filter(labo_name %in% list_labo_multiple) %>%
  arrange(labo_name) %>%
  datatable(options=list(pageLength = 5))
Code
# tous les auteurs et leur labos :
labo_all=read_csv("data/labo_info_raw.csv") %>%
  filter(labo_id %in% labo$labo_id) %>%
  inner_join(rosette) %>%
  dplyr::select(-labo_name) %>%
  inner_join(labo %>% dplyr::select(labo_id,labo_name,acronym_s)) 

# labo_all %>% dplyr::select(labo_id,labo_name) %>% distinct() %>% count(labo_name) %>% arrange(desc(n))

lab_author=labo_all %>%
  dplyr::count(nom_simple,labo_id,labo_name) %>%
  distinct() %>%
  mutate(labo_name=ifelse(nom_simple %in% umr_simple$nom_simple,"IDEES",labo_name))

prod_labo_doublon=lab_author %>%
  group_by(labo_name,labo_id) %>%
  summarise(nb_prod=sum(n)) %>%
  ungroup() %>%
  arrange(desc(nb_prod)) %>%
  group_by(labo_name) %>%
  mutate(nb_labo=n(),
         ordre_labo=1:n()) %>%
  ungroup() %>%
  arrange(desc(nb_labo),
          desc(labo_name),
          ordre_labo)

has_ror=labo %>%
  dplyr::select(labo_id,ror_s)
prod_labo_doublon=prod_labo_doublon %>%
  left_join(has_ror)
prod_labo_doublon %>% 
  filter(labo_name != "IDEES") %>%
  datatable(options=list(pageLength = 5))

On va raisonner maintenant en tant que labo_name et plus labo_id. Par contre on va quand meme récupérer le ROR avec une regle simple : Pour chaque labo, classé par ordre de production, on prend le ror le mieux classé.

Code
prod_labo_doublon_ror=prod_labo_doublon %>%
  group_by(labo_name) %>%
  mutate(nb_ror_na=length(which(is.na(ror_s)==TRUE))) %>%
  ungroup()
  
prod_labo_doublon_ror_ok=prod_labo_doublon_ror %>%
  # filter(nb_labo != nb_ror_na) %>%
  arrange(desc(nb_prod)) %>%
  group_by(labo_name) %>%
  group_modify(function(x,...) {
    if(unique(x$nb_labo)==unique(x$nb_ror_na)){
      x=x %>% arrange(ordre_labo) %>%
        slice(1)
    } 
    if(unique(x$nb_labo)!= unique(x$nb_ror_na)){
      x=x %>% 
        filter(!is.na(ror_s)) %>%
        arrange(ordre_labo) %>%
        slice(1)
    }
    return(x)
  }) %>%
  ungroup() %>%
  arrange(desc(nb_prod))

labo_name_clean=prod_labo_doublon_ror_ok %>%
  dplyr::select(labo_name,ror_s,labo_id) %>%
  inner_join(labo)
Code
# labo_all %>%
#   dplyr::select(labo_id,labo_name) %>%
#   distinct() %>%
#   count(labo_name) %>%
#   arrange(
#     desc(n)
#   ) %>% datatable(options=list(pageLength = 5))
# 
# labo_all %>% 
#   filter(labo_name=="Géographie-cités") %>% 
#   dplyr::select(labo_id,labo_name) %>% distinct()

Pour les affiliations, certaines personnes vont mettre parfois leur institution, leur département, ou leur laboratoire. Pour faire simple on prend l’affiliation majoritaire de chacun.

Par exemple (pris aléatoirement):

Code
samp_user=labo_all %>% count(nom_simple,labo_name) %>% arrange(desc(n)) %>%
  count(nom_simple) %>% 
  arrange(desc(n)) %>%
  filter(n >3) %>%
  slice_sample(n=1,weight_by = n) %>%
  pull(nom_simple)
# samp_user="j gravier"
labo_all %>% filter(nom_simple %in% samp_user) %>% 
  count(labo_name,nom_simple) %>% datatable(options=list(pageLength = 5))
Code
labo_maj=labo_all %>%
  # filter(grepl("tremelo",nom_simple)) %>%
  # left_join(labo_name_clean) %>%
  # left_join(labo %>% dplyr::select(labo_id,labo_name)) %>%
  # count(labo_id,labo_name,nom_simple) %>%
  count(labo_name,nom_simple) %>%
  arrange(desc(n)) %>%
  group_by(nom_simple) %>%
  group_modify(function(x,...) {
    # print(x)
    # si il y a au moins une affialition CNRS
    if(length(grep("CNRS",x$labo_name))>=1 &
       # mais aussi d'autres affiliations
       nrow(x %>% filter(!grepl("CNRS",x$labo_name))) >=1){
         # dans ce cas on ne prend pas le CNRS mais l'autre principale
      x=x %>% filter(!grepl("CNRS",x$labo_name)) %>%
        arrange(desc(n)) %>% slice(1)
    } else{
      x=x %>% 
        # arrange(desc(n)) %>%
        slice(1)
    }
    return(x)
  }
  ) %>%
  # slice(1) %>%
  ungroup() %>%
  arrange(desc(n)) %>%
  left_join(labo_name_clean) %>%
  mutate(labo_id=ifelse(nom_simple %in% umr_simple$nom_simple,97036,labo_id)) %>%
  mutate(labo_name=ifelse(nom_simple %in% umr_simple$nom_simple,"IDEES",labo_name))
  
labo_maj %>% filter(nom_simple %in% samp_user) %>%
  datatable(options=list(pageLength = 5))
Code
labo_all=labo_all %>% 
  dplyr::select(halId_s,nom_simple) %>%
  inner_join(labo_maj %>% dplyr::select(-n))

5.2 Statistiques globales

Code
paper_labo=paper %>% inner_join(labo_maj)
paper_acl=paper_labo %>% filter(docType_s %in% c("ART","ISSUE"))
paper_ouv=paper_labo %>% filter(docType_s %in% c("OUV","COUV"))
Code
#| fig-width: 9
#| fig-height: 16
#| 
stat_collab=paper_labo %>% 
  dplyr::select(labo_name,halId_s,docType_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  count(docType_s,labo_name)  %>%
  count(docType_s) %>%
  left_join(type_doc)
stat_collab %>%
  ggplot(aes(x=reorder(type,n),y=n))+
  geom_col()+
  ggtitle("Nombre total de laboratoires différents\nimpliqués dans un type de production scientifique")+
  geom_text(aes(label=n))+
  ylab("Nb")+
  xlab("")+
  theme_bw(base_size = 14)+
  theme(axis.text.x=element_text(angle=45,hjust=1))

Code
ggsave("figures/fig_11.svg",device = svglite::svglite)


stat_collab %>%
  # left_join(rosette_lab) %>%
  # filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "stat_collab_global_type",
    output_extension = ".csv",
    button_label     = "Nombre de collaborations par type de production",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
stat_collab_champs=paper_labo %>% 
  inner_join(paper_champ %>% dplyr::select(halId_s,champ1) %>%
               distinct()) %>%
  left_join(rosette_champs,by=c("champ1"="champs")) %>%
  dplyr::select(labo_name,halId_s,docType_s,label_champs) %>%
  filter(labo_name != "IDEES") %>%
  # dplyr::select()
  distinct() %>%
  count(docType_s,labo_name,label_champs)  %>%
  count(docType_s,label_champs) %>%
  left_join(type_doc)

stat_collab_champs %>%
  ggplot(aes(x=reorder(type,n),y=n))+
  geom_col()+
  ggtitle("Nombre total de laboratoires différents\nimpliqués dans un type de production scientifique")+
  geom_text(aes(label=n))+
  ylab("Nb")+
  xlab("")+
  theme_bw(base_size = 14)+
  theme(axis.text.x=element_text(angle=45,hjust=1))+
      facet_wrap_color(vars(label_champs),nrow=2,#lab_colors="auto",
                   colors=pal)

Code
ggsave("figures/fig_12.svg",device = svglite::svglite)



stat_collab_champs %>%
  # left_join(rosette_lab) %>%
  # filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "stat_collab_global_type_champs",
    output_extension = ".csv",
    button_label     = "Nombre de collaborations par type de production par champs",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

5.3 Principales collaborations, tout type de prod’

Nous ne compterons ici que les différents labos/instituts dans une publication. Deux personnes d’un même institut dans une même publi ne compteront que pour un.

Code
collab_all=paper_labo %>% 
  dplyr::select(labo_name,halId_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  count(labo_name) %>%
  arrange(desc(n),nchar(labo_name)) %>%
  mutate(labo_name=factor(labo_name,levels=rev(.$labo_name))) %>%
  mutate(rank=dense_rank(-n))

p_all=collab_all %>%
  # filter(n>3) %>%
  slice(1:40) %>%
  ggplot()+
  geom_col(aes(y=labo_name,x=n))+
  theme_bw(base_size=12)+
  geom_text(aes(y=labo_name,x=max(n),label = rank))+
  ggtitle("Les 40 principaux partenaires")+
  xlab("Nombre de publication")+
  ylab("")
ggplotly(p_all)
Code
ggsave("figures/fig_13.svg",device = svglite::svglite)


collab_all %>%
  left_join(rosette_lab) %>%
  # filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_all",
    output_extension = ".csv",
    button_label     = "les 40 principaux labos - toute production",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

Ici une meme production peut mobiliser plusieurs membres dans des champs différents. Les valeurs présentées sont donc susceptibles d’être plus importantes que sur les statistiques globales de l’UMR.

Code
collab_acl=paper_acl %>% 
  dplyr::select(labo_name,halId_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  count(labo_name) %>%
  arrange(desc(n),nchar(labo_name)) %>%
  mutate(labo_name=factor(labo_name,levels=rev(.$labo_name)))

champs_all=paper_labo %>% 
  inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
  left_join(rosette_champs,by=c("champ1"="champs")) %>%
  dplyr::select(halId_s,label_champs) %>%
  distinct()

collab_all_champs=paper_labo %>% 
  dplyr::select(labo_name,halId_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  inner_join(champs_all) %>%
  count(labo_name,label_champs) %>%
  arrange(desc(n),nchar(labo_name))


ordre=collab_all_champs %>% group_by(labo_name) %>% summarise(nb=sum(n)) %>% arrange(desc(nb)) %>%
  mutate(rank=dense_rank(-nb))

sel_lab_tmp=collab_all %>%
  # group_by(labo_name) 
  filter(n >4) %>% 
  pull(labo_name)


p_tmp=collab_all_champs %>%
  filter(!is.na(label_champs)) %>%
  # filter(labo_name %in% as.character(sel_lab_tmp)) %>%
  # inner_join(collab_all %>% rename(ntot=n)) %>%
  # arrange(desc(ntot),desc(n)) %>%
  inner_join(ordre %>%
               slice(1:40)) %>%
  arrange(rank,nchar(labo_name)) %>%
  mutate(labo_name=factor(labo_name)) %>%
  # filter(rank <40) %>%
  # slice(1:40) %>%
  ggplot()+
  geom_col(aes(y=reorder(labo_name,-rank),x=n,fill=label_champs))+
  scale_fill_manual(values=pal)+
  ggtitle("Les 40 principales collaborations (ACL)")+
  xlab("Nombre de publication ACL")+
  ylab("")
  # facet_wrap(~label_champs)
ggplotly(p_tmp)
Code
ggsave("figures/fig_14.svg",device = svglite::svglite)
Code
collab_all_champs %>%
  arrange(desc(n),nchar(labo_name)) %>%
  filter(!is.na(label_champs)) %>%
  group_by(label_champs) %>%
  slice(1:15) %>%
  filter(n>1) %>%
  ungroup() %>%
  inner_join(collab_all %>% rename(nb_tot=n)) %>%
  ggplot()+
  geom_col(aes(x=reorder(labo_name,nb_tot),y=n),width = 0.8)+
  # facet_grid_color(vars(label_champs), colors=pal,nrow=3,
  #                  scales = "free_y", space = "free_y")
    facet_wrap_color(vars(label_champs),nrow=3,ncol=2,#lab_colors="auto",
                   colors=pal,scale="free") +
  theme_bw(base_size=12)+
  ggtitle("Les labos avec au moins 2 collaborations")+
  ylab("Nombre de publication ACL")+
  xlab("")+
  theme(axis.text.x = element_text(angle=45,hjust=1))

Code
ggsave("figures/fig_15.svg",device = svglite::svglite)
# p_tmp
collab_all_champs %>%
  left_join(rosette_lab) %>%
  filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_all_champs",
    output_extension = ".csv",
    button_label     = "les principales collaborations entre labo par champs (toute production)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

5.4 Principales collaborations dans des ACL

Code
# champs_acl=paper_acl %>%
#   inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
#   left_join(rosette_champs,by=c("champ1"="champs")) %>%
#   dplyr::select(halId_s,label_champs) %>%
#   distinct()

collab_acl=paper_acl %>% 
  dplyr::select(labo_name,halId_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  count(labo_name) %>%
  arrange(desc(n),nchar(labo_name)) %>%
  mutate(labo_name=factor(labo_name,levels=rev(.$labo_name)))

p_acl=collab_acl %>%
  filter(n>3) %>%
  slice(1:40) %>%
  ggplot()+
  geom_col(aes(y=labo_name,x=n))+
  theme_bw(base_size=12)+
  ggtitle("Les 40 principaux laboratoires (ACL)")+
  xlab("Nombre de publication ACL")+
  ylab("")
ggplotly(p_acl)
Code
ggsave("figures/fig_16.svg",device = svglite::svglite)


collab_acl %>%
  left_join(rosette_lab) %>%
  # filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_acl",
    output_extension = ".csv",
    button_label     = "les 40 principaux labos ACL",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

Ici une meme ACL peut mobiliser plusieurs membres dans des champs différents. Les valeurs présentées sont donc susceptibles d’être plus importantes que sur les statistiques globales de l’UMR.

Code
champs_acl=paper_acl %>%
  inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
  left_join(rosette_champs,by=c("champ1"="champs")) %>%
  dplyr::select(halId_s,label_champs) %>%
  distinct()


# paper_champs=paper_acl %>% 
#   dplyr::select(halId_s,nom_simple) %>%
#   left_join(labo_maj) %>%
#   inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
#   dplyr::select(halId_s,champ1) %>%
#   rename(champs=champ1) %>%
#   left_join(rosette_champs) %>%
#   distinct()
# 
# yo=paper_acl %>% 
#   dplyr::select(halId_s,nom_simple) %>%
#   inner_join(labo_maj) %>%
#   inner_join(paper_champs) %>%
#   dplyr::select(labo_name,label_champs) %>%
#   distinct() %>%
#   filter(labo_name != "IDEES") %>%
#   inner_join(all_geocode_lite %>% st_drop_geometry() %>%
#                dplyr::select(labo_name,region) %>% distinct())


collab_acl_champs=paper_acl %>% # les publications ACL
  dplyr::select(labo_name,halId_s) %>% # on récupère les labos et les id hal
  distinct() %>% # on supprime les doublons (pour les labos)
  filter(labo_name != "IDEES") %>% # on supprimer l'UMR IDEES
  inner_join(champs_acl) %>% # on associe les champs à une publi (plusieurs possibilités)
  count(labo_name,label_champs) %>% # on compte par labo et par champs
  arrange(desc(n),nchar(labo_name))

agg_collab=collab_acl_champs %>%
  group_by(labo_name) %>%
  summarise(nb_tot=sum(n))

sel_lab_tmp=agg_collab %>%
  filter(nb_tot >3) %>% 
  pull(labo_name)
p_tmp=collab_acl_champs %>%
  arrange(desc(n),nchar(labo_name)) %>%
  filter(!is.na(label_champs)) %>%
  filter(labo_name %in% sel_lab_tmp) %>%
  # filter(n>2) %>%
  # group_by(label_champs) %>%
  # slice(1:15) %>%
  # filter(n>1) %>%
  # ungroup() %>%
  inner_join(agg_collab) %>%
  arrange(desc(nb_tot)) %>%
  ggplot()+
  geom_col(aes(y=reorder(labo_name,nb_tot),x=n,fill=label_champs))+
  scale_fill_manual(values=pal)+
  ggtitle("Les labos avec au moins 4 collaborations")+
  xlab("Nombre de publication ACL")+
  ylab("")
  # facet_wrap(~label_champs)
ggplotly(p_tmp)
Code
ggsave("figures/fig_17.svg",device = svglite::svglite)
Code
collab_acl_champs %>%
  arrange(desc(n),nchar(labo_name)) %>%
  filter(!is.na(label_champs)) %>%
  group_by(label_champs) %>%
  slice(1:15) %>%
  filter(n>1) %>%
  ungroup() %>%
  inner_join(collab_acl %>% rename(nb_tot=n)) %>%
  ggplot()+
  geom_col(aes(x=reorder(labo_name,nb_tot),y=n),width = 0.8)+
  # facet_grid_color(vars(label_champs), colors=pal,nrow=3,
  #                  scales = "free_y", space = "free_y")
    facet_wrap_color(vars(label_champs),nrow=3,ncol=2,#lab_colors="auto",
                   colors=pal,scale="free") +
  theme_bw(base_size=12)+
  ggtitle("Les labos avec au moins 2 collaborations")+
  ylab("Nombre de publication ACL")+
  xlab("")+
  theme(axis.text.x = element_text(angle=45,hjust=1))

Code
ggsave("figures/fig_18.svg",device = svglite::svglite)
# p_tmp
collab_acl_champs %>%
  left_join(rosette_lab) %>%
  filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_acl_champs",
    output_extension = ".csv",
    button_label     = "les principales collaborations entre labo (ACL)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

5.5 Principales collaborations dans des ouvrages / articles d’ouvrages

Code
collab_ouv=paper_ouv %>% 
  dplyr::select(labo_name,halId_s) %>%
  distinct() %>%
  filter(labo_name != "IDEES") %>%
  count(labo_name) %>%
  arrange(desc(n),nchar(labo_name)) %>%
  mutate(labo_name=factor(labo_name,levels=rev(.$labo_name)))

p_ouv=collab_ouv %>%
  # filter(n>3) %>%
  slice(1:40) %>%
  ggplot()+
  geom_col(aes(y=labo_name,x=n))+
  theme_bw(base_size=12)+
  ggtitle("Les principaux laboratoires (Ouvrages)")+
  xlab("Nombre d'ouvrages/chapitres")+
  ylab("")
ggplotly(p_ouv)
Code
ggsave("figures/fig_19.svg",device = svglite::svglite)


collab_ouv %>%
  left_join(rosette_lab) %>%
  # filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_ouv",
    output_extension = ".csv",
    button_label     = "les 40 principaux labos ouv",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )
Code
champs_ouv=paper_ouv %>% 
  inner_join(umr_simple %>% dplyr::select(nom_simple,champ1)) %>%
  left_join(rosette_champs,by=c("champ1"="champs")) %>%
  dplyr::select(halId_s,label_champs) %>%
  distinct()
collab_ouv_champs=paper_ouv %>% 
  dplyr::select(labo_name,halId_s) %>%
  filter(labo_name != "IDEES") %>%
  distinct() %>%
  left_join(champs_ouv) %>%
  count(labo_name,label_champs) %>%
  arrange(desc(n),nchar(labo_name))

agg_collab=collab_ouv_champs %>%
  group_by(labo_name) %>%
  summarise(nb_tot=sum(n))

p_tmp=collab_ouv_champs %>%
  arrange(desc(n),nchar(labo_name)) %>%
  filter(!is.na(label_champs)) %>%
  filter(n>1) %>%
  inner_join(agg_collab) %>%
  arrange(desc(nb_tot)) %>%
  ggplot()+
  geom_col(aes(y=reorder(labo_name,nb_tot),x=n,fill=label_champs))+
  scale_fill_manual(values=pal)+
  ggtitle("Les labos avec au moins deux collaborations")+
  xlab("Nombre de publications (Ouvrages)")+
  ylab("")
  # facet_wrap(~label_champs)
ggplotly(p_tmp)
Code
ggsave("figures/fig_20.svg",device = svglite::svglite)
Code
collab_ouv_champs %>%
  arrange(desc(n),nchar(labo_name)) %>%
  mutate(labo_name=substr(labo_name,0,20)) %>%
  filter(!is.na(label_champs)) %>%
  group_by(label_champs) %>%
  filter(n>=1) %>%
  # slice(1:30) %>%
  ungroup() %>%
  inner_join(collab_ouv %>% rename(nb_tot=n)) %>%
  ggplot()+
  geom_col(aes(x=reorder(labo_name,nb_tot),y=n),width = 0.8)+
  # facet_grid_color(vars(label_champs), colors=pal,nrow=3,
  #                  scales = "free_y", space = "free_y")
    facet_wrap_color(vars(label_champs),nrow=3,ncol=2,#lab_colors="auto",
                   colors=pal,scale="free") +
  theme_bw(base_size=10)+
  ggtitle("Les labos avec au moins une collaboration")+
  ylab("Nombre de publication (ouvrages)")+
  xlab("")+
  theme(axis.text.x = element_text(angle=45,hjust=1))

Code
ggsave("figures/fig_21.svg",device = svglite::svglite)
# p_tmp
collab_ouv_champs %>%
  left_join(rosette_lab) %>%
  filter(is.na(label_champs)) %>%
  # dplyr::select(-type2) %>%
  download_this(
    output_name      = "main_lab_ouv_champs",
    output_extension = ".csv",
    button_label     = "les principales collaborations entre labo (ouv)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

6 L’UMR dans l’espace

6.1 Préambule : localisation des laboratoires / instituts

La localisation des laboratoires / instituts a été faite en plusieurs temps, selon les situations. * le laboratoire / institut est inscrit dans le ROR (Research Organization Registry). Dans ce cas on regarde les informations fournies en interrogeant https://api.ror.org/v2/organizations/ID_ROR et on extrait la localisation précise (lon/lat) si renseignée. Si aucune localisation n’est renseignée, dans ce cas on passe à l’étape suivante. * Pas de ROR ou de localisation : Dans ce cas on regarde l’adresse renseignée dans la base. On utilise une appli type geoname pour convertir l’adresse (+ville + pays) en lat / lon. * Si cela ne renvoi rien, on regarde juste la ville et le pays. * Si cela ne renvoi toujours rien, on pose des règles pour adapter l’adresse pour quelle soit intelligible (suppression d’informations inutiles, de double code postaux, etc…)

6.2 Localisation des laboratoires / instituts

Nous présentons ici les collaborations via des productions scientifiques entre l’UMR les différents institutions de recherches.

Code
all_geocode_lite=read_sf("data/loc_labo.gpkg")

# rosette_lab=labo_all %>%
rosette_lab=labo%>%
  mutate(labo_name=ifelse(grepl("LITIS",labo_name),"LITIS",labo_name)) %>%
  dplyr::select(labo_id,labo_name) %>%
  distinct()
all_geocode_lite=all_geocode_lite %>%
  left_join(rosette_lab) %>%
  mutate(region=ifelse(
    country_s %in% c("de","es","ch","be","it",
                     "no","se","fi","dk","lb",
                     "lt","pl","ro","mx","gr","pt","cy","bg",
                     "za","gb"),
    "Europe","Monde"
  )) %>%
  mutate(region=ifelse(country_s=="fr","France",region)) %>%
  group_by(labo_name) %>%
  slice(1) %>%
  ungroup() %>%
  st_jitter(factor=0.00001)


# all_geocode_lite %>% st_drop_geometry() %>%
#   count(country_s,region)

Les cartes suivantes présentent le nombre de collaboration (taille et couleurs des points) pour chaque institution de recherche.

Code
labo_collab=labo_all %>%
  # group_by(halId_s) %>%
  count(halId_s,labo_name) %>%
  arrange(desc(n)) %>%
  count(labo_name) %>%
  arrange(desc(n)) %>%
  filter(labo_name!="IDEES")

labo_collab_all_sf=all_geocode_lite %>%
  # dplyr::select(-n) %>%
  inner_join(labo_collab) %>%
  dplyr::select(n,labo_name)
mapview(labo_collab_all_sf,cex="n",zcol="n")
Code
labo_collab_acl=labo_all %>% 
  inner_join(paper_type) %>%
  filter(docType_s %in% c("ART","ISSUE")) %>%
  # group_by(halId_s) %>%
  count(halId_s,labo_name) %>%
  arrange(desc(n)) %>%
  count(labo_name) %>%
  arrange(desc(n)) %>%
  filter(labo_name!="IDEES")
labo_collab_all_sf_acl=all_geocode_lite %>%
  # dplyr::select(-n) %>%
  inner_join(labo_collab_acl) %>%
  dplyr::select(n,labo_name)
mapview(labo_collab_all_sf_acl,cex="n",zcol="n")
Code
labo_collab_ouv=labo_all %>% 
  inner_join(paper_type) %>%
  filter(docType_s %in% c("OUV","COUV")) %>%
  # filter(docType_s %in% c("ART","ISSUE")) %>%
  # group_by(halId_s) %>%
  count(halId_s,labo_name) %>%
  arrange(desc(n)) %>%
  count(labo_name) %>%
  arrange(desc(n)) %>%
  filter(labo_name!="IDEES")
  
labo_collab_all_sf_ouv=all_geocode_lite %>%
  # dplyr::select(-n) %>%
  inner_join(labo_collab_ouv) %>%
  dplyr::select(n,labo_name)
mapview(labo_collab_all_sf_ouv,cex="n",zcol="n")

Les cartes suivantes présentent le nombre de laboratoire (numéro) par zone géographiques. La taille des cercles correspond au nombre de collaboration.

Code
pal <- colorQuantile("YlOrRd", labo_collab_all_sf$n)
leaflet() %>%
  addTiles() %>%
   addProviderTiles(providers$Esri.WorldTopoMap) %>%
  addCircleMarkers(data = labo_collab_all_sf,
                   label=~paste0(labo_name,"\n",
                                 n),
                       labelOptions = labelOptions(
      noHide = TRUE,          # Keeps the label always visible (not just on hover)
      textOnly = TRUE,        # Removes the default white background box
      direction = "top",      # Position of the label relative to the circle
      style = list("font-weight" = "bold", "font-size" = "12px")
    ),
                   clusterOptions = markerClusterOptions(),
                   fillOpacity = 0.5,
    radius = ~n, #color = ~pal(n), 
    stroke = FALSE)
Code
# mapview(labo_collab_all_sf,cex="n",zcol="n")
Code
leaflet() %>%
  addTiles() %>%
   addProviderTiles(providers$Esri.WorldTopoMap) %>%
  addCircleMarkers(data = labo_collab_all_sf_acl,
                   label=~paste0(labo_name,"\n",
                                 n),
                       labelOptions = labelOptions(
      noHide = TRUE,          # Keeps the label always visible (not just on hover)
      textOnly = TRUE,        # Removes the default white background box
      direction = "top",      # Position of the label relative to the circle
      style = list("font-weight" = "bold", "font-size" = "12px")
    ),
                   clusterOptions = markerClusterOptions(),
                   fillOpacity = 0.5,
    radius = ~n, #color = ~pal(n), 
    stroke = FALSE)
Code
# mapview(labo_collab_all_sf_acl,cex="n",zcol="n")
Code
leaflet() %>%
  addTiles() %>%
   addProviderTiles(providers$Esri.WorldTopoMap) %>%
  addCircleMarkers(data = labo_collab_all_sf_ouv,
                    label=~paste0(labo_name,"\n",
                                 n),
                       labelOptions = labelOptions(
      noHide = TRUE,          # Keeps the label always visible (not just on hover)
      textOnly = TRUE,        # Removes the default white background box
      direction = "top",      # Position of the label relative to the circle
      style = list("font-weight" = "bold", "font-size" = "12px")
    ),
                   clusterOptions = markerClusterOptions(),
                   fillOpacity = 0.5,
    radius = ~n, #color = ~pal(n), 
    stroke = FALSE)

6.3 Stat par répartition géographique et par champs

Ici sont représentées les collaborations par institutions de recherches par zone géographiques. Contrairement à ce qui est présenté plus haut (4.2), nous prenons ici en compte les multiples travaux en commun. Par exemple si un 5 ACL ont été publiées avec une même institution en France par des membres d’un champs, tous ces articles seront pris en compte. Les diagrammes suivant peuvent être donc interprétés comme la part des ACL par champs et par grande région (France, Europe, Monde).

Code
collab_acl_champs_pays=collab_acl_champs %>%
  inner_join(all_geocode_lite %>% st_drop_geometry() %>%
              dplyr::select(labo_name,region) %>% distinct())
tot_publi_champ_acl=collab_acl_champs_pays %>%
  group_by(label_champs) %>%
  summarise(nb=sum(n))
Code
stat_collab_acl_champs_pays= collab_acl_champs_pays %>%
  mutate(region=factor(region,levels=c("France","Europe","Monde"))) %>%
  arrange(region) %>%
  group_by(label_champs,region) %>%
  summarise(n=sum(n)) %>%
  ungroup() %>%
  group_by(label_champs) %>%
  arrange(desc(region)) %>%
  mutate(sum_chamsp=sum(n)) %>%
  mutate(pc=round(100*n/sum(n))) %>%
  mutate(pos=(cumsum(n)-n/2)) %>%
  ungroup() %>%
  # mutate(lab_pc=paste(n, "/",pc,"%"))
     mutate(lab_pc=paste(pc,"%"))      
stat_collab_acl_champs_pays %>%
    ggplot(aes(x=""))+
  geom_bar(stat="identity",aes(fill=region,y=n))+

  geom_text_repel(aes(label = lab_pc,y=pos))+
  facet_wrap_color(vars(label_champs),nrow=2,#lab_colors="auto"
                   colors=pal,scale="free") +
  coord_polar("y",start=0)+
  scale_fill_brewer(palette="Set2",name="")+
  geom_text(data=tot_publi_champ_acl,
            aes(x=-Inf,y=Inf,
                label=paste0("Total=",nb)),
            hjust = 0.5,
            vjust=7.5)+
  ggtitle("Collaboration ACL par zone géographique selon les champs")+
  theme_bw(base_size = 12)+
  theme(legend.position = "bottom",
        legend.direction = "horizontal",axis.text = element_blank(),
        )+
  xlab("")+ylab("")

Code
ggsave("figures/fig_22.svg",device = svglite::svglite)


stat_collab_acl_champs_pays%>% # dplyr::select(-pc_champ) %>%
  # filter(champs != "Autre") %>%
  download_this(
    output_name      = "stat_champs_acl_world",
    output_extension = ".csv",
    button_label     = "Collaboration via ACL et champs(CSV)",
    button_type      = "primary",
    has_icon         = TRUE,
    icon             = "fa fa-download"
  )

7 Informations de session

R version 4.6.1 (2026-06-24)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.4 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Etc/UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] svglite_2.2.2      knitr_1.52         rmarkdown_2.32     ggrepel_0.9.8     
 [5] deeptime_2.4.0     leaflet_2.2.3      plotly_4.12.1      DT_0.34.0         
 [9] downloadthis_0.5.0 jsonlite_2.0.0     stringr_1.6.0      ggplot2_4.0.3     
[13] readr_2.2.0        mapview_2.11.4     dplyr_1.2.1        sf_1.1-2          
[17] renv_1.2.4        

loaded via a namespace (and not attached):
 [1] DBI_1.3.0               leafpop_0.1.0           gridExtra_2.3.1        
 [4] rlang_1.3.0             magrittr_2.0.5          otel_0.2.0             
 [7] e1071_1.7-17            compiler_4.6.1          png_0.1-9              
[10] systemfonts_1.3.2       vctrs_0.7.3             pkgconfig_2.0.3        
[13] crayon_1.5.3            fastmap_1.2.0           leafem_0.2.5           
[16] labeling_0.4.3          ggfittext_0.10.4        tzdb_0.5.0             
[19] purrr_1.2.2             bit_4.6.0               xfun_0.60              
[22] satellite_1.0.6         cachem_1.1.0            uuid_1.2-2             
[25] tweenr_2.0.3            jpeg_0.1-11             terra_1.9-50           
[28] parallel_4.6.1          R6_2.6.1                bslib_0.12.0           
[31] stringi_1.8.9           RColorBrewer_1.1-3      bsplus_0.1.5           
[34] lubridate_1.9.5         jquerylib_0.1.4         Rcpp_1.1.2             
[37] base64enc_0.1-6         leaflet.providers_3.0.0 timechange_0.4.0       
[40] tidyselect_1.2.1        yaml_2.3.12             codetools_0.2-20       
[43] curl_7.1.0              lattice_0.23-1          tibble_3.3.1           
[46] withr_3.0.3             S7_0.2.2                evaluate_1.0.5         
[49] units_1.0-1             proxy_0.4-29            polyclip_1.10-7        
[52] pillar_1.11.1           KernSmooth_2.23-27      stats4_4.6.1           
[55] generics_0.1.4          vroom_1.7.1             deeptimedata_1.0.0     
[58] sp_2.2-3                grImport2_0.3-3         hms_1.1.4              
[61] scales_1.4.0            class_7.3-24            glue_1.8.1             
[64] tools_4.6.1             data.table_1.18.4       fs_2.1.0               
[67] XML_3.99-0.23           grid_4.6.1              tidyr_1.3.2            
[70] crosstalk_1.2.2         raster_3.6-32           ggforce_0.5.0          
[73] brew_1.0-10             cli_3.6.6               textshaping_1.0.5      
[76] viridisLite_0.4.3       gtable_0.3.6            ggh4x_0.3.1            
[79] sass_0.4.10             digest_0.6.39           classInt_0.4-11        
[82] htmlwidgets_1.6.4       farver_2.1.2            htmltools_0.5.9        
[85] lifecycle_1.0.5         httr_1.4.8              mime_0.13              
[88] bit64_4.8.4             MASS_7.3-66