2017-09-27 4 views
1

J'utilise la trame de données suivantes:Comment ajouter des barres de comparaison à une parcelle pour indiquer quelle valeur de comparaison ap correspond à

df1 <- structure(list(Genotype = structure(c(1L, 1L, 1L, 1L, 1L, 
2L,2L,2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L,1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
.Label= c("miR-15/16 FL", "miR-15/16 cKO"), class = "factor"), 
Tissue = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L), .Label = c("iLN", "Spleen", "Skin", "Colon"), class = "factor"), 
`Cells/SC/Live/CD8—,, CD4+/Foxp3+,Median,<BV421-A>,CD127` = c(518L, 
715L, 572L, 599L, 614L, 881L, 743L, 722L, 779L, 843L, 494L, 
610L, 613L, 624L, 631L, 925L, 880L, 932L, 876L, 926L, 1786L, 
2079L, 2199L, 2345L, 2360L, 2408L, 2509L, 3129L, 3263L, 3714L, 
917L, NA, 1066L, 1059L, 939L, 1269L, 1047L, 974L, 1048L, 
1084L)), 
.Names = c("Genotype", "Tissue", "Cells/SC/Live/CD8—,,CD4+/Foxp3+,Median,<BV421-A>,CD127"), 
row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame")) 

et essayer de faire un terrain à l'aide ggplot2 où des parcelles de boîte et les points sont affichés regroupés par "Tissue" et entrelacés par "Genotype". Les valeurs de signification s'affichent correctement, mais j'aimerais ajouter des lignes pour indiquer les comparaisons effectuées et les faire commencer au centre de chaque boîte à lettres "miR-15/16 FL" et se terminer au centre de chaque "miR-15/16 cKO "boîte plot et assis directement en dessous des valeurs de signification. Ci-dessous le code que je utilise pour générer le terrain:

library(ggplot2) 
library(ggpubr) 
color.groups <- c("black","red") 
names(color.groups) <- unique(df1$Genotype) 
shape.groups <- c(16, 1) 
names(shape.groups) <- unique(df1$Genotype) 

ggplot(df1, aes(x = Tissue, y = df1[3], color = Genotype, shape = Genotype)) + 
    geom_boxplot(position = position_dodge(), outlier.shape = NA) + 
    geom_point(position=position_dodge(width=0.75)) + 
    ylim(0,1.2*max(df1[3], na.rm = TRUE)) + 
    ylab('MFI CD127 (of CD4+ Foxp3+ T cells') + 
    scale_color_manual(values=color.groups) + 
    scale_shape_manual(values=shape.groups) + 
    theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), 
        axis.title.x=element_blank(), aspect.ratio = 1, 
        text = element_text(size = 9)) + 
    stat_compare_means(show.legend = FALSE, label = 'p.format', method = 't.test', 
        label.y = c(0.1*max(df1[3], na.rm = TRUE) + max(df1[3][c(1:10),], na.rm = TRUE), 
           0.1*max(df1[3], na.rm = TRUE) + max(df1[3][c(11:20),], na.rm = TRUE), 
           0.1*max(df1[3], na.rm = TRUE) + max(df1[3][c(21:30),], na.rm = TRUE), 
           0.1*max(df1[3], na.rm = TRUE) + max(df1[3][c(31:40),], na.rm = TRUE))) 

enter image description here

Merci pour toute aide!

Répondre

2

J'ai créé les crochets avec trois appels à geom_segment. Ces appels utilisent une nouvelle trame de données dmax créée pour fournir les valeurs y de référence pour le positionnement des crochets et des étiquettes de valeur p. Les valeurs e et r servent à peaufiner ces positions.

J'ai apporté quelques autres modifications à votre code.

  1. changer le nom de la troisième colonne à temp et utiliser ce nom y=temp dans l'appel à ggplot. Votre code d'origine utilise y=df1[3], qui s'étend essentiellement en dehors de l'environnement de tracé à l'objet df1 dans l'environnement parent, ce qui peut entraîner des problèmes. De plus, avoir un nom court auquel se référer permet de générer plus facilement la trame de données dmax et de se référer à ses colonnes.

  2. Utilisez le bloc de données dmax pour les positions label.y dans stat_compare_means, ce qui réduit la quantité de code nécessaire. (Incidemment, stat_compare_means semble exiger codées en dur label.y positions, plutôt que de les obtenir à partir d'une cartographie aes des données.)

  3. Position la valeur p étiquettes une distance absolue ci-dessus chaque paire de boîtes à moustaches (en utilisant la valeur e), plutôt qu'une distance multiplicative. Cela facilite la cohérence de l'espacement entre les étiquettes de valeur p, les crochets et les boîtes à moustaches.


# Use a short column name for the third column 
names(df1)[3] = "temp" 

# Generate data frame of reference y-values for p-value labels and bracket positions 
dmax = df1 %>% group_by(Tissue) %>% 
    summarise(temp=max(temp, na.rm=TRUE), 
      Genotype=NA) 

# For tweaking position of brackets 
e = 350 
r = 0.6 
w = 0.19 
bcol = "grey30" 

ggplot(df1, aes(x = Tissue, y = temp, color = Genotype, shape = Genotype)) + 
    geom_boxplot(position = position_dodge(), outlier.shape = NA) + 
    geom_point(position=position_dodge(width=0.75)) + 
    ylim(0,1.2*max(df1[3], na.rm = TRUE)) + 
    ylab('MFI CD127 (of CD4+ Foxp3+ T cells') + 
    scale_color_manual(values=color.groups) + 
    scale_shape_manual(values=shape.groups) + 
    theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), 
        axis.title.x=element_blank(), aspect.ratio = 1, 
        text = element_text(size = 9)) + 
    stat_compare_means(show.legend = FALSE, label = 'p.format', method = 't.test', 
        label.y = e + dmax$temp) + 
    geom_segment(data=dmax, 
       aes(x=as.numeric(Tissue)-w, xend=as.numeric(Tissue)+w, 
        y=temp + r*e, yend=temp + r*e), size=0.3, color=bcol, inherit.aes=FALSE) + 
    geom_segment(data=dmax, 
       aes(x=as.numeric(Tissue) + w, xend=as.numeric(Tissue) + w, 
        y=temp + r*e, yend=temp + r*e - 60), size=0.3, color=bcol, inherit.aes=FALSE) + 
    geom_segment(data=dmax, 
       aes(x=as.numeric(Tissue) - w, xend=as.numeric(Tissue) - w, 
        y=temp + r*e, yend=temp + r*e - 60), size=0.3, color=bcol, inherit.aes=FALSE) 

enter image description here

Pour répondre à votre commentaire, voici un exemple pour montrer que la méthode ci-dessus permet de régler de manière inhérente à un certain nombre de x-catégories.

Commençons par l'ajout de deux nouvelles catégories de tissus:

library(forcats) 

df1$Tissue = fct_expand(df1$Tissue, "Tissue 5", "Tissue 6") 
df1$Tissue[seq(1,20,4)] = "Tissue 5" 
df1$Tissue[seq(21,40,4)] = "Tissue 6" 

dmax = df1 %>% group_by(Tissue) %>% 
    summarise(temp=max(temp, na.rm=TRUE), 
      Genotype=NA) 

Exécuter maintenant exactement le même code de tracé ci-dessus pour obtenir la parcelle suivante:

enter image description here

+0

Cool! Oui ça marche plutôt bien. Il serait préférable que les extrémités des supports soient alignées avec le centre des boîtes à moustaches ...probablement juste besoin d'ajuster la valeur 0,45 ... Où avez-vous obtenu la valeur de 0,45? J'avais espéré un moyen de le faire avec ggpubr qui lui permettrait d'être plus accommodant à l'ajout de tissus supplémentaires ou d'enlever des tissus de l'intrigue. Ils ont un appel "comparisons =" ​​que vous pouvez passer une liste de comparaisons à mais je ne pouvais pas comprendre comment l'utiliser. –

+1

Les catégories x sont positionnées numériquement aux valeurs x 1 à n, où n = 4 dans ce cas. Ainsi, +/- 0,45 laissera un peu d'espace entre les parenthèses pour les groupes adjacents (comme vous pouvez le voir dans les deux premiers groupes de la placette, car ils ont des positions y similaires). J'ai mis à jour le code en ajoutant un paramètre 'w' pour définir la largeur du support. Cette méthode s'ajuste automatiquement pour différents nombres de x-catégories, puisque 'w' est toujours ajouté/soustrait de n'importe quel nombre de x-catégories que l'intrigue se trouve avoir. – eipi10