Recently my girl-friend asked me whether I could do some data project being useful for our family rather than just for myself. A couple of years ago – after our first son was born – we decided to rent a small garden (allotment garden) very close to our flat. In our garden we grow some fruit and vegetables, e.g. strawberries, peas, beans and beetroot.
When growing fruit and vegetables it is considered important to know that plants compete for resources. While some plants benefit from one another, other plants sould not be grown together. The internet provides loads of so-called companion planting guides or charts (see Link). For each plant, they define lists of companions (growing well together) and antogonists (not growing well together).
This blog post is to show how to visualize a companion planting guide using
R and the
Packages and data
readxl for importing data from Excel,
dplyr for data wrangling and
ggplot2 for data visualization three
R packages are required to reproduce the results of this blog post.
library(readxl) library(dplyr) library(ggplot2)
The data I'm going to visualize stem from some companion planting guides published in German (see Link). I only selected the plants relevant for our garden and entered the data manually into an Excel worksheet.
In the first step, I saved the imported data into a data frame (
mydata.1). The second data frame
mydata.2 is a copy of
mydata.1 with the first two variables in reverse order. In order to receive a matrix (with the same number of factor levels in each column), I merged
mydata using the
mydata.1 <- readxl::read_excel('guide.xlsx', sheet = 1) mydata.2 <- mydata.1[, c(2, 1, 3)] colnames(mydata.2) <- colnames(mydata.1) mydata <- rbind(mydata.1, mydata.2) rm(list = c(setdiff(ls(), c('mydata')))) head(mydata, 10)
## # A tibble: 10 × 3 ## plant_1 plant_2 status ## <chr> <chr> <chr> ## 1 cucumber peas companion ## 2 corn peas companion ## 3 radish peas companion ## 4 peas cucumber companion ## 5 corn cucumber companion ## 6 beetroot cucumber companion ## 7 corn potatoes companion ## 8 potatoes cabbage companion ## 9 radish cabbage companion ## 10 strawberries lettuce companion
Finally, I removed all objects from workspace not required for data visualization and printed the first ten lines of the
tibble (slightly modified data frame)
With the following code snippet, all variables of
mydata are transformed into
factors. Furthermore, a parameter needed for plotting is saved as a vector named
mydata <- dplyr::mutate_all(mydata, as.factor) labs.n <- length(levels(mydata$plant_1)) + .5
Finally, we plot the matrix using the
ggplot2 package. In order to adjust the position of the grid lines, we remove to default grid lines with
panel.grid.major = element_blank() and
panel.grid.minor = element_blank() and draw new grid lines with
geom_hline(). The new grid lines are in accordance with the boundaries of the tiles.
ggplot(mydata, aes(x = plant_1, y = plant_2, fill = status)) + theme_grey() + coord_equal() + geom_tile() + theme(axis.text.x = element_text(angle = 45, hjust = 1), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = 'bottom') + geom_vline(xintercept = seq(0.5, labs.n, 1), color='white') + geom_hline(yintercept = seq(0.5, labs.n, 1), color='white') + scale_fill_manual('', values = c("red3", "green3")) + labs(x='', y='', title = "Companion Planting Guide")
The interpretation of the companion planting guide is very easy: While green tiles signal companion plants that can be grown close to each other, red tiles flag antagonist plants that should not be grown together. The squares are gray when the plants are neither companions nor antagonists.