Sample data:
### Data
df <- data.frame(year = seq(as.Date("1998/1/1"), as.Date("2012/1/1"), "years"),
ton = sample(200:500, 15, replace = TRUE),
trend = sample(50:100, 15, replace = TRUE),
count = sample(100:200, 15, replace = TRUE))
### Load the needed libraries
library(ggplot2)
library(scales)
library(grid)
library(gridExtra)
### Make a plot
plot1 <- ggplot(data = df, aes(x = year, y = ton)) + geom_bar(stat = "identity") +
scale_x_date(breaks = df$year, labels = date_format("%Y")) +
theme_bw()
plot2 <- ggplot(data = df, aes(x = year, y = trend)) + geom_line() +
geom_point(shape = 21, size = 4, fill = "white") +
scale_x_date(breaks = df$year, labels = date_format("%Y")) +
theme_bw()
I combined both plots using the grid.arrange, and here is the syntax:
grid.arrange(plot1, plot2, nrow = 2, top = "Sample data trend")
I tried the following code to make a table (the year and count variables, but the result is not good.
### Create new dataframe for the table
df1 <- data.frame(count = df$count,
row.names = df$year)
df1 <- as.data.frame(t(df1))
### Add table below the graph
tt <- ttheme_default(colhead=list(fg_params = list(parse=TRUE)))
tbl <- tableGrob(df1, rows=NULL, theme=tt)
grid.arrange(plot1, plot2, tbl,
nrow = 3,
as.table = TRUE)
The result of the above syntax:

Question: How can I make it fit in the graph area, and how to make the table closer to the line plot graph so that the white space will be minimized? And if there's any way to customize it?
Thank you.

grid.arrangegotheightsandwidthsparameters. Use them.grid.arrange(plot1, plot2, tbl, nrow = 3, heights = c(15, 15, 5), widths = c(10, 10, 5), as.table = TRUE), but the result is still the same, the table overlaps across the graph area.