I'm relatively new to R and I'm struggling to figure out a way to get a set of plots with different y values. Below is a simplified version of the dataset I'm working on.
Cell | x | y1 | y2 | y3 | y4 |
---|---|---|---|---|---|
A | 1 | 0.5 | 0.7 | 0.9 | 1.1 |
A | 2 | 0.6 | 0.8 | 1.0 | 1.2 |
A | 3 | 0.7 | 0.9 | 1.1 | 1.3 |
B | 1 | 0.5 | 2.9 | 4.0 | 3.1 |
B | 2 | 0.6 | 3.0 | 4.1 | 3.2 |
B | 3 | 0.7 | 3.1 | 4.2 | 3.3 |
As it stands now, what I have is the code below
ggplot(ETO2, aes(x = x, y = y1)
geom_line()
facet_wrap(~Cell)
Is there a simple way to plot different y-values per facet? For example I would want data with Cell=A to plot y1 over x and for data with Cell=B i'd want it to plot y3 over x. Preferably i would like to see the plots as one output. Note that in my actual data sets, there are a lot more cell lines, and it would also be nice to easily switch the columns for the y-values.
Thank you so much, and I hope I explained my intention as clear as possible. If not, please feel free to ask more.
CodePudding user response:
In general, "no", but you can create a new variable that takes from y1
or y3
depending on the Cell
. If it's just two values, then ifelse
will suffice,
ETO2$y0 <- ifelse(ETO2$Cell == "A", ETO2$y1, ETO2$y3)
If there are more, though, you may prefer dplyr::case_when
or data.table::fcase
.
From here, just choose the new variable y0
instead:
ggplot(ETO2, aes(x = x, y = y0))
geom_line()
facet_wrap(~Cell)
CodePudding user response:
Another solution would be to produce two plots by filtering ET02 on values of column Cell, then joining to have a single output. You can easily switch for various columns as y axis in this way
library(ggplot2)
library(tidyverse)
library(patchwork) # package for joining ggplot2 plots in different ways
ETO2 %>%
filter(Cell == "A") %>% # select only rows with "A" value in Cell
ggplot(., aes(x = x, y = y1)) # plot over desired y
geom_line() -> p1
ETO2 %>%
filter(Cell == "B") %>% # select only rows with "B" value in Cell
ggplot(., aes(x = x, y = y3)) # plot over desired y
geom_line() -> p2
p1 p2 # side by side
p1 / p2 # top and bottom
In case you would like to have the same ranges of y axis with different values, you can set ylim()
p1 ylim(0,5) -> p1_lim
p2 ylim(0,5) -> p2_lim
p1_lim p2_lim
CodePudding user response:
Create a dictionary dict specifying which y column to plot in which cell, merge it with ETO2, create a new y variable and plot. If any cells are not to be associated with a facet then omit such cells from dict.
library(dplyr)
library(ggplot2)
dict <- data.frame(Cell = c("A", "B"), ycol = c("y1", "y3"))
ETO2 %>%
inner_join(dict, by = "Cell") %>%
rowwise %>%
mutate(Cell = paste(Cell, ycol, sep = "-"), y = get(ycol)) %>%
ungroup %>%
ggplot(aes(x, y))
geom_line()
facet_wrap(~ Cell)
Note
ETO2 <- structure(list(Cell = c("A", "A", "A", "B", "B", "B"), x = c(1L,
2L, 3L, 1L, 2L, 3L), y1 = c(0.5, 0.6, 0.7, 0.5, 0.6, 0.7), y2 = c(0.7,
0.8, 0.9, 2.9, 3, 3.1), y3 = c(0.9, 1, 1.1, 4, 4.1, 4.2), y4 = c(1.1,
1.2, 1.3, 3.1, 3.2, 3.3)), class = "data.frame", row.names = c(NA,
-6L))