Jan van der Laan
2023-Oct-06 09:50 UTC
[R] Is it possible to get a downward pointing solid triangle plotting symbol in R?
Does adding , show.legend = c("color"=TRUE, "fill"=FALSE) to the geom_point do what you want? Best, Jan On 06-10-2023 11:09, Chris Evans via R-help wrote:> library(tidyverse) > tibble(x = 2:9, y = 2:9, c = c(rep("A", 5), rep("B", 3))) -> tmpTibPoints > tibble(x = c(1, 5, 5, 1), y = c(1, 1, 5, 5), a = rep("a", 4)) -> > tmpTibArea1 > tibble(x = c(5, 10, 10, 5), y = c(1, 1, 5, 5), a = rep("b", 4)) -> > tmpTibArea2 > tibble(x = c(1, 5, 5, 1), y = c(5, 5, 10, 10), a = rep("c", 4)) -> > tmpTibArea3 > tibble(x = c(5, 10, 10, 5), y = c(5, 5, 10, 10), a = rep("d", 4)) -> > tmpTibArea4 > bind_rows(tmpTibArea1, > ????????? tmpTibArea2, > ????????? tmpTibArea3, > ????????? tmpTibArea4) -> tmpTibAreas > ggplot(data = tmpTib, > ?????? aes(x = x, y = y)) + > ? geom_polygon(data = tmpTibAreas, > ?????????????? aes(x = x, y = y, fill = a)) + > ? geom_point(data = tmpTibPoints, > ???????????? aes(x = x, y = y, fill = c), > ???????????? pch = 24, > ???????????? size = 6)
Chris Evans
2023-Oct-06 10:11 UTC
[R] Is it possible to get a downward pointing solid triangle plotting symbol in R?
Sadly, no.? Still shows the same legend with both sets of fill mappings.? I have found a workaround, sadly much longer than yours (!) that does get me what I want but it is a real bodge.? Still interested to see if there is a way to create a downward pointing solid symbol but here is my bodge using new_scale_fill() and new_scale_color() from the ggnewscale package (many thanks to Elio Campitelli for that). library(tidyverse) library(ggnewscale) # allows me to change the scales used tibble(x = 2:9, y = 2:9, ?????? ### I have used A:C to ensure the changes sort in the correct order to avoid the messes of using shape to scale an ordinal variable ?????? ### have to say that seems a case where it is perfectly sensible to map shapes to an ordinal variable, scale_shape_manual() makes ?????? ### this difficult hence this bodge ?????? c = c(rep("A", 5), "B", rep("C", 2)), ?????? change = c(rep("Deteriorated", 5), "No change", rep("Improved", 2))) %>% ? ### this is just keeping the original coding but not used below ? mutate(change = ordered(change, ????????????????????????? levels = c("Deteriorated", "No change", "Improved"))) -> tmpTibPoints ### create the area mapping tibble(x = c(1, 5, 5, 1), y = c(1, 1, 5, 5), a = rep("a", 4)) -> tmpTibArea1 tibble(x = c(5, 10, 10, 5), y = c(1, 1, 5, 5), a = rep("b", 4)) -> tmpTibArea2 tibble(x = c(1, 5, 5, 1), y = c(5, 5, 10, 10), a = rep("c", 4)) -> tmpTibArea3 tibble(x = c(5, 10, 10, 5), y = c(5, 5, 10, 10), a = rep("d", 4)) -> tmpTibArea4 bind_rows(tmpTibArea1, ????????? tmpTibArea2, ????????? tmpTibArea3, ????????? tmpTibArea4) -> tmpTibAreas ### now plot ggplot(data = tmpTib, ?????? aes(x = x, y = y)) + ? geom_polygon(data = tmpTibAreas, ?????????????? aes(x = x, y = y, fill = a), ?????????????? alpha = .5) + ? scale_fill_manual(name = "Areas", ??????????????????? values = c("orange", "purple", "yellow", "brown"), ??????????????????? labels = letters[1:4]) + ? ### next two lines use ggnewscale functions to reset the scale mappings ? new_scale_fill() + ? new_scale_colour() + ? ### can now use the open triangles and fill aesthetic to map them ? geom_point(data = tmpTibPoints, ???????????? aes(x = x, y = y, shape = c, fill = c, colour = c), ???????????? size = 6) + ? ### use the ordered variable c to get mapping in desired order ? ### which, sadly, isn't the alphabetical order! ? scale_shape_manual(name = "Change", ?????????????????? values = c("A" = 24, ????????????????????????????? "B" = 23, ????????????????????????????? "C" = 25), ?????????????????? labels = c("Deteriorated", ????????????????????????????? "No change", ????????????????????????????? "Improved")) + ? scale_colour_manual(name = "Change", ?????????????????? values = c("A" = "red", ????????????????????????????? "B" = "grey", ????????????????????????????? "C" = "green"), ?????????????????? labels = c("Deteriorated", ????????????????????????????? "No change", ????????????????????????????? "Improved")) + ? scale_fill_manual(name = "Change", ?????????????????? values = c("A" = "red", ????????????????????????????? "B" = "grey", ????????????????????????????? "C" = "green"), ?????????????????? labels = c("Deteriorated", ????????????????????????????? "No change", ????????????????????????????? "Improved")) That gives the attached plot which is really what I want.? Long bodge though!* * On 06/10/2023 11:50, Jan van der Laan wrote:> > Does adding > > , show.legend = c("color"=TRUE, "fill"=FALSE) > > to the geom_point do what you want? > > Best, > Jan > > On 06-10-2023 11:09, Chris Evans via R-help wrote: >> library(tidyverse) >> tibble(x = 2:9, y = 2:9, c = c(rep("A", 5), rep("B", 3))) -> >> tmpTibPoints >> tibble(x = c(1, 5, 5, 1), y = c(1, 1, 5, 5), a = rep("a", 4)) -> >> tmpTibArea1 >> tibble(x = c(5, 10, 10, 5), y = c(1, 1, 5, 5), a = rep("b", 4)) -> >> tmpTibArea2 >> tibble(x = c(1, 5, 5, 1), y = c(5, 5, 10, 10), a = rep("c", 4)) -> >> tmpTibArea3 >> tibble(x = c(5, 10, 10, 5), y = c(5, 5, 10, 10), a = rep("d", 4)) -> >> tmpTibArea4 >> bind_rows(tmpTibArea1, >> ?????????? tmpTibArea2, >> ?????????? tmpTibArea3, >> ?????????? tmpTibArea4) -> tmpTibAreas >> ggplot(data = tmpTib, >> ??????? aes(x = x, y = y)) + >> ?? geom_polygon(data = tmpTibAreas, >> ??????????????? aes(x = x, y = y, fill = a)) + >> ?? geom_point(data = tmpTibPoints, >> ????????????? aes(x = x, y = y, fill = c), >> ????????????? pch = 24, >> ????????????? size = 6) >-- Chris Evans (he/him) Visiting Professor, UDLA, Quito, Ecuador & Honorary Professor, University of Roehampton, London, UK. Work web site: https://www.psyctc.org/psyctc/ CORE site: http://www.coresystemtrust.org.uk/ Personal site: https://www.psyctc.org/pelerinage2016/ -------------- next part -------------- A non-text attachment was scrubbed... Name: ggnewscale_solution.png Type: image/png Size: 17846 bytes Desc: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20231006/b054a7e6/attachment.png>