Adding table within the plotting region of a ggplot in r
You can use ggplot2
's annotation_custom
with a tableGrob
from the gridExtra
package.
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)
With the release of 'ggplot2' 3.0.0 and 'ggpmisc' 0.3.0 a new simpler answer is 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 fully supports tibbles (see release announcement) making it possible to map a list of data frames to the label
aesthetic. The new geom_table()
in package 'ggpmisc 0.3.0' takes advantage of this, making the addition of tables with a syntax similar to that of geom_label()
possible (see documentation). Here seemed most appropriate to add the table as an
annotation, but of course geom_table()
can also be used directly, as other ggplot
geometries.
@user3206440, @Punintended An easy way of removing row numbers exists: add rows = NULL
to the call to 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)
Please see the gridExtra Wiki.
@user3206440: I found a work-around that removes row numbers. I formatted my data as a matrix, assigned column names, then had tableGrob call that directly. Whenever I had tableGrob call it as a data frame, the row name persisted.
Below is an example. I'm sure there's an easier way to deal with the chisq.test output
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")
And then later...
annotation_custom(tableGrob(chidf), xmin=2, xmax=6, ymin=700, ymax=800)