web-dev-qa-db-fra.com

Ajout de table dans la zone de tracé d'un ggplot dans r

Je voudrais ajouter un tableau des coordonnées du site mis en évidence dans un ggplot.

En utilisant une précédente question comme exemple de données:

set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
ggplot(mydata,aes(x=a,y=b)) + 
    geom_point(colour="blue") + 
    geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5)

enter image description here

Je voudrais ajouter le tableau suivant au coin inférieur droit de la parcelle dans la région de la parcelle. Aucun conseil?

table<-cbind(sites=c("site 1","site 2","site 3","site 4"),mydata[10:13,])
table

    sites  a          b
    site 1 10 -0.3053884
    site 2 11  1.5117812
    site 3 12  0.3898432
    site 4 13 -0.6212406
35
Elizabeth

Vous pouvez utiliser le ggplot2 de annotation_custom avec une variable tableGrob du paquetage gridExtra.

library(ggplot2)
library(gridExtra)
set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
mytable <- cbind(sites=c("site 1","site 2","site 3","site 4"),mydata[10:13,])
k <- ggplot(mydata,aes(x=a,y=b)) + 
  geom_point(colour="blue") + 
  geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5) + 
  annotation_custom(tableGrob(mytable), xmin=35, xmax=50, ymin=-2.5, ymax=-1)

enter image description here

61
Matthew Plourde

@ user3206440, @Punintended Une méthode simple pour supprimer les numéros de ligne existe: ajoutez rows = NULL à l'appel de tableGrob.

library(ggplot2)
library(gridExtra)
set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
mytable <- 
   cbind(sites=c("site 1","site 2","site 3","site 4"), mydata[10:13,])
k <- ggplot(mydata,aes(x=a,y=b)) + 
  geom_point(colour="blue") + 
  geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5) + 
  annotation_custom(tableGrob(mytable, rows=NULL), 
                    xmin=35, xmax=50, ymin=-2.5, ymax=-1)

 Plot image

S'il vous plaît voir le gridExtra Wiki .

5
Pedro Aphalo

Avec la publication de 'ggplot2' 3.0.0 et 'ggpmisc' 0.3.0, une nouvelle réponse plus simple est possible:

library(ggplot2)
library(ggpmisc)

set.seed(1)
mydata <- data.frame(a = 1:50, b = rnorm(50))
table <- cbind(sites=c("site 1", "site 2", "site 3", "site 4"), mydata[10:13, ])

ggplot(mydata, aes(x = a, y = b)) + 
  geom_point(colour = "blue") + 
  geom_point(data = mydata[10:13, ], aes(x = a, y = b), colour = "red", size = 5) +
  annotate(geom = "table", x = 37, y = -0.8, label = list(table), 
           vjust = 1, hjust = 0)

'ggplot2' 3.0.0 supporte pleinement les mots (voir release release ) permettant de mapper une liste de trames de données à l'esthétique label. La nouvelle geom_table() dans le package 'ggpmisc 0.3.0' en tire parti, rendant possible l'ajout de tableaux avec une syntaxe similaire à celle de geom_label() (voir documentation ). Ici, il semble plus approprié d’ajouter le tableau en tant qu’annotation Mais, bien sûr, geom_table() peut également être utilisé directement, comme autres géométries ggplot.

 enter image description here

1
Pedro Aphalo

@ user3206440: J'ai trouvé une solution de rechange qui supprime les numéros de ligne. J'ai formaté mes données sous forme de matrice, avec des noms de colonne attribués, puis appelée directement par tableGrob. Chaque fois que j'ai appelé tableGrob comme un cadre de données, le nom de la ligne persiste.

Ci-dessous un exemple. Je suis sûr qu'il existe un moyen plus simple de gérer la sortie chisq.test

chivalues <- chisq.test(chitable)
chidf <- matrix(c(unlist(c(round(as.numeric(chivalues[1]), 2),
                    chivalues[2], round(as.numeric(chivalues[3]), 5), numcells))),
                   nrow = 1, ncol = 4, byrow = FALSE)
colnames(chidf) <- c("Chi-Squared", "DF", "P Value", "Total Cells")

Et puis plus tard ...

annotation_custom(tableGrob(chidf), xmin=2, xmax=6, ymin=700, ymax=800)
1
Punintended