Jan van der Laan
2023-Oct-06 10:55 UTC
[R] Is it possible to get a downward pointing solid triangle plotting symbol in R?
You are right, sorry. Another possible solution then: use geom_text instead of geom_point and use a triangle shape as text: ggplot(data = tmpTibPoints, aes(x = x, y = y)) + geom_polygon(data = tmpTibAreas, aes(x = x, y = y, fill = a)) + geom_text(data = tmpTibPoints, aes(x = x, y = y, label = "?", color = c), size = 6) + guides(color = FALSE) On 06-10-2023 12:11, Chris Evans via R-help wrote:> 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) >> >> >> ______________________________________________ >> 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 http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code.
Chris Evans
2023-Oct-06 12:21 UTC
[R] Is it possible to get a downward pointing solid triangle plotting symbol in R?
Thanks again Jan.? That is lovely and clean and I probably should have seen that option. I had anxieties about the portability of using text.? (The function will end up in my https://github.com/cpsyctc/CECPfuns package so I'd like it to be fairly immune to character sets and different platforms in different countries. I'm morphing this question a lot now but I guess it's still on topic really.? I know I need to put in some time to understand the complexities of R and platforms (I'm pretty exclusively on Linux, Ubuntu or Debian now so have mostly done the ostrich thing about these issues though I do hit problems exchanging things with my Spanish speaking colleagues).? Jan or anyone: any simple reassurance or pointers to resources I should best use for homework about these issues? TIA (again!) Chris On 06/10/2023 12:55, Jan van der Laan wrote:> You are right, sorry. > > Another possible solution then: use geom_text instead of geom_point > and use a triangle shape as text: > > ggplot(data = tmpTibPoints, > ?????? aes(x = x, y = y)) + > ? geom_polygon(data = tmpTibAreas, > ?????????????? aes(x = x, y = y, fill = a)) + > ? geom_text(data = tmpTibPoints, > ???????????? aes(x = x, y = y, label = "?", color = c), > ???????????? size = 6) + guides(color = FALSE) >[much snipped] -- 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/