wake-up-neo.com

Hinzufügen einer Tabelle im Plotbereich eines ggplot in r

Ich möchte eine Tabelle mit den Koordinaten der hervorgehobenen Site in einem ggplot hinzufügen.

Verwenden Sie eine vorherige Frage als Beispieldaten:

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

Ich möchte die folgende Tabelle in der rechten unteren Ecke des Diagramms innerhalb des Diagrammbereichs hinzufügen. Irgendein Rat?

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

Sie können ggplot2s annotation_custom mit einer tableGrob aus dem gridExtra-Paket verwenden.

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 Es gibt eine einfache Möglichkeit, Zeilennummern zu entfernen: Fügen Sie rows = NULL zum Aufruf von tableGrob hinzu.

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

Siehe das gridExtra Wiki .

5
Pedro Aphalo

Mit der Veröffentlichung von 'ggplot2' 3.0.0 und 'ggpmisc' 0.3.0 ist eine neue einfachere Antwort möglich:

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 unterstützt vollständig tibbles (siehe release announcement ), wodurch es möglich ist, eine Liste von Datenrahmen der label-Ästhetik zuzuordnen. Das neue geom_table() im Paket 'ggpmisc 0.3.0' macht sich das zu Nutze und ermöglicht das Hinzufügen von Tabellen mit einer ähnlichen Syntax wie geom_label() (siehe documentation ). Hier schien es am besten, die Tabelle als -Anmerkung hinzuzufügen, aber geom_table() kann natürlich auch direkt als andere ggplot-Geometrien verwendet werden.

 enter image description here

1
Pedro Aphalo

@ user3206440: Ich habe eine Problemumgehung gefunden, die Zeilennummern entfernt. Ich habe meine Daten als Matrix formatiert, Spaltennamen zugewiesen und dann von tableGrob direkt aufgerufen. Immer wenn ich tableGrob als Datenrahmen bezeichnen ließ, blieb der Zeilenname bestehen.

Unten ist ein Beispiel. Ich bin sicher, es gibt einen einfacheren Weg, mit der Ausgabe von chisq.test umzugehen

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")

Und dann später ...

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