zap2008 - 1 year ago 160
R Question

# How can I add a table to my ggplot2 output?

Is there a quick way to add a table to my ggplot2 graph? I would like this table to have the value of each line at the same breakpoints as specified in

`scale_x_continuous()`
, but with the percentage (%) symbol next to them. My end goal is to create something like the image below. However, I don't know how to add the table.

The following block of code just makes two lines in ggplot2 and should be adequate to provide me with an example:

``````require(ggplot2)
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10))
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) + geom_line(aes(y = a), colour = 'red') +
geom_line(aes(y = b), colour = 'blue') + scale_x_continuous(breaks = seq(0,100,10))
df.plot
``````

A similar question was asked here, but the given answer is more of a workaround and wouldn't look good for a table with 2 rows. I am going to mess around with the clues provided by Brian Diggs, but I figured I would post this in case anyone has already done something like this. Any help would be greatly appreciated!

Edit: Thanks to @baptiste for helping me figure this out. I posted my own response below that finished what he started.

Here's a basic example of the strategy used by learnr:

``````require(ggplot2)
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10))
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) +
geom_line(aes(y = a), colour = 'red') +
geom_line(aes(y = b), colour = 'blue') +
scale_x_continuous(breaks = seq(0,100,10))

# make dummy labels for the table content
df\$lab <- month.abb[ceiling((df\$a+1)/10)]

df.table <- ggplot(df, aes(x = a, y = 0,
label = lab, colour = b)) +
geom_text(size = 3.5) +
theme_minimal() +
scale_y_continuous(breaks=NULL)+
theme(panel.grid.major = element_blank(), legend.position = "none",
panel.border = element_blank(), axis.text.x =  element_blank(),
axis.ticks =  element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank())

gA <- ggplotGrob(df.plot)
gB <- ggplotGrob(df.table)[3,]
gB\$heights <- unit(1,"line")

require(gridExtra)
gAB <- rbind(gA, gB)
grid.newpage()
grid.draw(gAB)
``````

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download