I want to observe the trend of FTSW. Colors are distinguished by different blocs, and shapes and line types are distinguished by traitement, like the figure below:

Please see the original data below:
df<-structure(list(Bloc = c(7, 7, 8, 8, 5, 5, 7, 7, 8, 8, 5, 5, 7,
7, 8, 8, 5, 5), Pos_heliaphen = c("W16", "W17", "W36", "W37",
"X02", "X03", "W16", "W17", "W36", "W37", "X02", "X03", "W16",
"W17", "W36", "W37", "X02", "X03"), traitement = c("WS", "WW",
"WW", "WS", "WS", "WW", "WS", "WW", "WW", "WS", "WS", "WW", "WS",
"WW", "WW", "WS", "WS", "WW"), Variete = c("Blancas", "Blancas",
"Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas",
"Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas",
"Blancas", "Blancas", "Blancas", "Blancas"), Date_obs = c("D07_27/05/2021",
"D07_27/05/2021", "D07_27/05/2021", "D07_27/05/2021", "D07_27/05/2021",
"D07_27/05/2021", "D12_07/06/2021", "D12_07/06/2021", "D12_07/06/2021",
"D12_07/06/2021", "D12_07/06/2021", "D12_07/06/2021", "D13_08/06/2021",
"D13_08/06/2021", "D13_08/06/2021", "D13_08/06/2021", "D13_08/06/2021",
"D13_08/06/2021"), FTSW_apres_arros = c(-0.82561716279966, -0.83052784248231,
-0.833812425397989, -0.826677385087996, -0.831991201718322, -0.827650244364889,
0.900083501645054, 0.899646933005172, 0.920126486265779, 0.901668054319428,
0.899616920453791, 0.899570142896103, -0.82561716279966, -0.83052784248231,
-0.833812425397989, -0.826677385087996, -0.831991201718322, -0.827650244364889
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-18L))
df %>%
select(1,2,3,4,5,6) %>%
ggplot(aes(Date_obs, FTSW_apres_arros),colour= Bloc,shape=traitement, linetype=traitement)
geom_point()
geom_line()
labs(y=expression(paste('FTSW')))
theme(legend.position="bottom", axis.text.x = element_text(angle = 90, hjust = 1))
If not considering the manual editing, how can I change the legend to the figure belowing:

CodePudding user response:
One issue with your code is that you put the closing parenthesis for aes() at the wrong position so that color, shape and linetype were not included in aes(). Also, as your Date_obs column is a categorical you have to group by e.g. interaction(Bloc, traitement) to get a line plot:
library(ggplot2)
library(dplyr)
df %>%
select(1, 2, 3, 4, 5, 6) %>%
ggplot(aes(Date_obs, FTSW_apres_arros, colour = factor(Bloc), shape = traitement,
linetype = traitement, group = interaction(Bloc, traitement)))
geom_point()
geom_line()
labs(y = expression(paste("FTSW")))
theme(legend.position = "bottom", axis.text.x = element_text(angle = 90, hjust = 1))
EDIT You could create a vector of labels from your dataset which you could pass to scale_color_discrete like so:
Note: I also added guide = guide_legend(order = 1) so that the color legend comes first.
library(ggplot2)
library(dplyr)
labels <- df |>
select(Bloc, Pos_heliaphen) |>
distinct(Bloc, Pos_heliaphen) |>
group_by(Bloc) |>
summarise(Pos_heliaphen = paste(Pos_heliaphen, collapse = "-")) |>
tibble::deframe()
df %>%
select(1, 2, 3, 4, 5, 6) %>%
ggplot(aes(Date_obs, FTSW_apres_arros, colour = factor(Bloc), shape = traitement, linetype = traitement, group = interaction(Bloc, traitement)))
geom_point()
geom_line()
scale_color_discrete(labels = labels, guide = guide_legend(order = 1))
labs(y = expression(paste("FTSW")))
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 90, hjust = 1))



