I have the following data set:
set.seed(7736)
categories <- rep(LETTERS[1:11], each = 30)
values <- sample(50:200, 330, replace = T)
df <- data.frame(category = categories, values = values)
And I am creating the following graph:
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
data_set <- data_set |>
mutate(x = row_number(), .by = {{ category }})
graph <- ggplot(data_set, aes(
x = x,
y = {{ y_axis_parameter }}, colour = {{ category }},
group = 1
)) +
geom_line() +
geom_point() +
facet_grid(cols = vars({{ category }}), scales = "free_x") +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(plot.title = element_text(hjust = 0.5)) +
theme(legend.position = "none")
graph
}
As you see my grids are the categories.
What I want to do is instead of having all the data shown in one row, I want to have 2 or 3 rows, so the graph is more readable. When I pass nrows= 2
to facet_grid(), I get error that the number of rows must be "NULL".
Question: Is there a parameter that I can pass to facet_grid() that automatically split my data into more rows (lets say 2 or 3). As you see, in the above graph, I have 11 groups, so if I choose to have two rows then one of the rows must display more number of categories (6 categories for the first row and 5 for the second). Or if I want to display data in 3 rows then 11 is not divisible by 3 and I don't know even if facet_grid() would be able to do what I am looking for. Any help would be really appreciated.
You can use facet_wrap()
instead of facet_grid()
. It will automatically
pick a
reasonable ratio of
cols to rows.
library(tidyverse)
graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) {
data_set <- data_set |>
mutate(x = row_number(), .by = {{ category }})
graph <- ggplot(data_set, aes(
x = x,
y = {{ y_axis_parameter }}, colour = {{ category }},
group = 1
)) +
geom_line() +
geom_point() +
facet_wrap(vars({{category}}), scales = "free_x") +
ylab(paste0(attribute_name, " Measured Values")) +
xlab("Data Points") +
labs(title = paste0(attribute_name)) +
theme(plot.title = element_text(hjust = 0.5)) +
theme(legend.position = "none")
graph
}
df |>
graph_builder(values, category, "blargh")
df |>
filter(category %in% LETTERS[1:5]) |>
graph_builder(values, category, "blargh")