Ah, I accidentally replied only to you. I re-introduced the list here... Maybe this [1] will help?
[1] https://coolbutuseless.github.io/2021/11/04/custom-ggplot2-point-shapes-with-gggrid/ On October 8, 2023 1:04:23 AM PDT, Chris Evans <chrish...@psyctc.org> wrote: > >On 07/10/2023 17:45, Jeff Newmiller wrote: >> No, you seem to be missing the distinction between code points (numbers >> representing the semantics of a character) and the visible presentation of a >> character. Some graphics devices don't understand Unicode at all (e.g. >> pdf()) and not all fonts have glyphs for all code points. >Thanks, that's helpful. I think I have no illusions about that distinction >but seem to have overvalued what it said in >https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Encoding-issues. >That doesn't alert to the issue with pdf() and fonts. I did have a niggly >feeling things couldn't be as easy as that seemed to imply. >> Which is not to say you cannot get away with using this approach... but you >> will need to be prepared to deal with "it doesn't work" or "it looks wrong" >> complaints so documenting where it doesn't work (as you deal with such >> complaints?) may be advisable for your sanity. A solution that hardcoded >> three-sided polygons would avoid such concerns though it would be more >> tedious. > >And certainly beyond my limited programming capacities. Hm, I suspect PDF >output will be important to to some users, probably including myself, so if >that won't handle this then I think I probably will go for the clumsy but >seemingly usable workaround using ggnewscale at least for now. I'll check out >its output with the main graphic file outputs (probably not the correct term: >pdf(), png() etc.) but I assume that as the fillable triangles are in the >default R symbols they will come through to those various outputs. > >Was there a reason you replied only to me? This seems the sort of >clarification that I learn from watching the list: too trivial? I would like >to post it to the list but won't unless you are OK for me to do that. > >Many thanks again ... > >Chris > >> >> On October 7, 2023 8:18:24 AM PDT, Chris Evans via >> R-help<r-help@r-project.org> wrote: >>> SO helpful. Thanks to all. I _think_ the answer to Jeff's question may be >>> "It should only be problematical on R earlier than 2.10". At least, >>> that's how I read this: >>> >>> There is a portable way to have arbitrary text in character strings (only) >>> in your R code, which is to supply them in Unicode as ‘\uxxxx’ >>> escapes (or, rarely needed except for emojis, ‘\Uxxxxxxxx’ escapes). If >>> there are any characters not in the current encoding the parser >>> will encode the character string as UTF-8 and mark it as such. This applies >>> also to character strings in datasets: they can be prepared >>> using ‘\uxxxx’ escapes or encoded in UTF-8 in a UTF-8 locale, or even >>> converted to UTF-8 /via/ |iconv()|. If you do this, make sure you have >>> ‘R (>= 2.10)’ (or later) in the ‘Depends’ field of the DESCRIPTION file. >>> >>> (Quoting >>> fromhttps://cran.r-project.org/doc/manuals/r-release/R-exts.html#Encoding-issues. >>> Thanks for that pointer Jan.) >>> >>> ### using UTF to solve my issue (for R versions >= 2.10 I think) >>> library(tidyverse) >>> tibble(x = 2:9, y = 2:9, c = c(rep("A", 5), rep("B", 3))) %>% >>> mutate(y1 = y + 1, >>> y2 = y + 2) -> 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 >>> >>> # Unicode characters for black up- and down-pointing characters >>> pts_shapes <- c("\U25B2", "\U25BC") |> setNames(c("A", "B")) >>> pts_colors <- c("blue", "red") |> setNames(c("A", "B")) >>> >>> pts_shapes >>> >>> ggplot() + >>> ### this was the suggestion from Rui Barradas >>> geom_point(data = tmpTibPoints, >>> aes(x = x, y = y, color = c, shape = c), >>> size = 6) + >>> ### checking what happens using geom_text (for amusement really) >>> geom_text(data = tmpTibPoints, >>> aes(x = x, y = y1, label = c)) + >>> ### and checking using the UTF characters in annotate() too (ditto) >>> annotate(geom = "text", x = 2.5, y = 8.5, label = paste(pts_shapes, >>> collapse = " ")) + >>> scale_shape_manual(values = pts_shapes) + >>> scale_color_manual(values = pts_colors) >>> >>> Output attached. Thanks to Jan and Rui particularly. R-help providing >>> wide and deep R education as ever. >>> >>> >>> On 06/10/2023 17:05, Jeff Newmiller wrote: >>>> Doesn't the outcome of this suggestion still depend on which fonts and >>>> output device you are using? ... and that is to some degree still system >>>> dependent... >>>> >>>> On October 6, 2023 7:50:00 AM PDT, Rui Barradas<ruipbarra...@sapo.pt> >>>> wrote: >>>>> Às 10:09 de 06/10/2023, Chris Evans via R-help escreveu: >>>>>> The reason I am asking is that I would like to mark areas on a plot >>>>>> using geom_polygon() and aes(fill = variable) to fill various polygons >>>>>> forming the background of a plot with different colours. Then I would >>>>>> like to overlay that with points representing direction of change: >>>>>> improved, no reliable change, deteriorated. The obvious symbols to use >>>>>> for those three directions are an upward arrow, a circle or square and a >>>>>> downward pointing arrow. There is a solid upward point triangle symbol >>>>>> in R (ph = 17) and there are both upward and downward pointing open >>>>>> triangle symbols (pch 21 and 25) but to fill those with a solid colour >>>>>> so they will be visible over the background requires that I use a fill >>>>>> aesthetic and that gets me a mess with the legend as I will have used a >>>>>> different fill mapping to fill the polygons. This silly reprex shows >>>>>> the issue I think. >>>>>> >>>>>> 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) >>>>>> >>>>>> Does anyone know a way to create a solid downward pointing symbol? Or >>>>>> another workaround? >>>>>> >>>>>> TIA, >>>>>> >>>>>> Chris >>>>>> >>>>> Hello, >>>>> >>>>> Maybe you can solve the problem with unicode characters. >>>>> See the two scale_*_manual at the end of the plot. >>>>> >>>>> >>>>> >>>>> # Unicode characters for black up- and down-pointing characters >>>>> pts_shapes <- c("\U25B2", "\U25BC") |> setNames(c("A", "B")) >>>>> pts_colors <- c("blue", "red") |> setNames(c("A", "B")) >>>>> >>>>> ggplot(data = tmpTibAreas, >>>>> 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, color = c, shape = c), >>>>> size = 6) + >>>>> scale_shape_manual(values = pts_shapes) + >>>>> scale_color_manual(values = pts_colors) >>>>> >>>>> >>>>> >>>>> -- Sent from my phone. Please excuse my brevity. ______________________________________________ R-help@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.