Luigi Marongiu
2025-Jun-13 06:41 UTC
[R] How to stratify data with multiple group simultaneously with R ggplot2?
Thank you, facets are good but I was looking for something that could merge everything in a single plot. I found that I could create an additional column, say M (merge), that accommodates two parameters into one, for instance, `a + A`, `a + B` etc. By grouping for M, I can kind of stratify the data... On Sun, Jun 8, 2025 at 6:03?PM Rui Barradas <ruipbarradas at sapo.pt> wrote:> > ?s 07:21 de 08/06/2025, Luigi Marongiu escreveu: > > I would like to plot multivariate data with ggplot2. I have multiple > > groups that I need to account for: I have the `x` and `y` values, but > > the data must be stratified also by `w` and `z`. I can group by either > > `w` or `z`, but how can I group for both simultaneously? > > In essence, in the example below, the legend should have two columns > > (A and B) and five rows (which are already there since the data is > > stratified by w). There should be 10 colors. > > How can I do that? > > Thank you > > > >>>>>>> > > ``` > > df = data.frame(x = c(rep(1,5), rep(2,5), rep(3,5), rep(4,5)), > > w = rep(letters[1:5],4), > > z = c(rep(LETTERS[1],10), rep(LETTERS[2],10)), > > y = rnorm(20), > > stringsAsFactors = FALSE) > > library(ggplot2) > > ggplot(df, aes(x=x, y=y, colour=w, group=w)) + > > geom_line(linewidth=2) + > > ggtitle("A+B") > > ggplot(df[df$z=="A",], aes(x=x, y=y, colour=w, group=w)) + > > geom_line(linewidth=2) + > > ggtitle("A") > > ggplot(df[df$z=="B",], aes(x=x, y=y, colour=w, group=w)) + > > geom_line(linewidth=2) + > > ggtitle("B") > > ``` > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide https://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > Hello, > > You can use the 4th variable to define facets. Like this? > > > ggplot(df, aes(x=x, y=y, colour=w)) + > geom_line(linewidth=2) + > facet_wrap(~ z, scales = "free_x") + > ggtitle("A+B") > > > Hope this helps, > > Rui Barradas > > > > -- > Este e-mail foi analisado pelo software antiv?rus AVG para verificar a presen?a de v?rus. > www.avg.com-- Best regards, Luigi
Rui Barradas
2025-Jun-13 11:14 UTC
[R] How to stratify data with multiple group simultaneously with R ggplot2?
?s 07:41 de 13/06/2025, Luigi Marongiu escreveu:> Thank you, facets are good but I was looking for something that could > merge everything in a single plot. I found that I could create an > additional column, say M (merge), that accommodates two parameters > into one, for instance, `a + A`, `a + B` etc. By grouping for M, I can > kind of stratify the data... > > On Sun, Jun 8, 2025 at 6:03?PM Rui Barradas <ruipbarradas at sapo.pt> wrote: >> >> ?s 07:21 de 08/06/2025, Luigi Marongiu escreveu: >>> I would like to plot multivariate data with ggplot2. I have multiple >>> groups that I need to account for: I have the `x` and `y` values, but >>> the data must be stratified also by `w` and `z`. I can group by either >>> `w` or `z`, but how can I group for both simultaneously? >>> In essence, in the example below, the legend should have two columns >>> (A and B) and five rows (which are already there since the data is >>> stratified by w). There should be 10 colors. >>> How can I do that? >>> Thank you >>> >>>>>>>>> >>> ``` >>> df = data.frame(x = c(rep(1,5), rep(2,5), rep(3,5), rep(4,5)), >>> w = rep(letters[1:5],4), >>> z = c(rep(LETTERS[1],10), rep(LETTERS[2],10)), >>> y = rnorm(20), >>> stringsAsFactors = FALSE) >>> library(ggplot2) >>> ggplot(df, aes(x=x, y=y, colour=w, group=w)) + >>> geom_line(linewidth=2) + >>> ggtitle("A+B") >>> ggplot(df[df$z=="A",], aes(x=x, y=y, colour=w, group=w)) + >>> geom_line(linewidth=2) + >>> ggtitle("A") >>> ggplot(df[df$z=="B",], aes(x=x, y=y, colour=w, group=w)) + >>> geom_line(linewidth=2) + >>> ggtitle("B") >>> ``` >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >> Hello, >> >> You can use the 4th variable to define facets. Like this? >> >> >> ggplot(df, aes(x=x, y=y, colour=w)) + >> geom_line(linewidth=2) + >> facet_wrap(~ z, scales = "free_x") + >> ggtitle("A+B") >> >> >> Hope this helps, >> >> Rui Barradas >> >> >> >> -- >> Este e-mail foi analisado pelo software antiv?rus AVG para verificar a presen?a de v?rus. >> www.avg.com > > >Hello, Any of Jeff's two suggestions seems to work well. (I prefer the first one.) library(ggplot2) library(dplyr) ggplot(df, aes(x = x, y = y, colour = w, linetype = z)) + geom_line(linewidth = 2) + ggtitle("A+B") df %>% mutate(M = interaction(w, z)) %>% # arrange(M) %>% print() ggplot(aes(x=x, y=y, colour=w, group = M)) + geom_line(linewidth=2) + ggtitle("A+B") Hope this helps, Rui Barradas