teunbrand / ggh4x

ggplot extension: options for tailored facets, multiple colourscales and miscellaneous
https://teunbrand.github.io/ggh4x/
Other
542 stars 33 forks source link

Could an auto-contrast aesthetic function be add to ggh4x? #163

Closed davidhodge931 closed 2 weeks ago

davidhodge931 commented 3 weeks ago

Below is a function that I derived for my R package from your work, but now want to remove - as I want to make sure licensing is more straightforward and all kosha.

I took your work, and modified it slightly to make it functional with args for the specific dark colour and light colour. So I'm not sure whether you need to include a license to your ggplot2 tricks in with this code..

Anyway, I'll add a PR, and you can merge it in and add any licencing to yourself needed, if you'd like it. It works nice :)

library(ggplot2)
library(dplyr)

get_contrast <- function(fill, dark = "black", light = "white") {
  out <- rep(dark, length(fill))
  channel <- farver::get_channel(fill, "l", space = "hcl")
  out[channel < 50] <- light
  out
}

aes_contrast <- function(..., dark = "#121B24FF", light = "#FFFFFFFF") {

  ggplot2::aes(
    colour = ggplot2::after_scale(
      get_contrast(.data$fill, dark = dark, light = light)
    )
  )
}

iris |>
  group_by(Species) |>
  summarise(average = mean(Sepal.Length, na.rm = TRUE)) |> 
  ggplot(aes(x = Species, y = average, fill = Species)) +
  geom_col(
    position = position_dodge2(preserve = "single"),
    width = 0.75,
  ) +
  scale_fill_manual(values = c("navy", "orange", "hotpink")) +
  geom_text(
    mapping = aes(label = average, !!!aes_contrast()),
    position = position_dodge2(width = 0.75, preserve = "single"),
    vjust = 1.33,
    show.legend = FALSE,
  )

Created on 2024-07-09 with reprex v2.1.0

davidhodge931 commented 3 weeks ago

Still needs add any licensing to ggplot2 tricks required

davidhodge931 commented 2 weeks ago

2nd thoughts, I think that aes_contrast() works well in ggblanket - just need to do some more research about how to make the licensing etc kosha

teunbrand commented 2 weeks ago

Hi David, sorry I saw you busy with this PR and I didn't respond in a timely fashion. In terms of licencing, I think ggblanket is MIT and the ggplot tricks is MIT, so that shouldn't pose a problem. If it helps, I'd be happy to take the unlicense for ggplot tricks.

davidhodge931 commented 2 weeks ago

Oh, no problem @teunbrand, I've gone around in circles on this (like many things!). I think the function works well in ggblanket, as it fits nicely with everything else.

My main concern is just that I'm not sure what I'm doing in this regard.

I think if I copy and paste your MIT license into the R script in my package with some sort of note saying these were derived from ggplot tricks, and/or add you as a contributor? Maybe that's the easiest way.. Have you seen something similar done before in an R package? https://github.com/davidhodge931/ggblanket/blob/main/R/aes_contrast.R

davidhodge931 commented 2 weeks ago

Maybe it's sufficiently different and non-unique that its fine?? The get_contrast autocontrast function is just an ifelse based on farver::get_channel, and the aes_contrast bit is just a function based on ggplot2::scale

davidhodge931 commented 1 week ago

My implementation of your ggplot2::after_scale tricks below. I've referenced you in the NEWS. Happy to put you down as a contributor - just let me know in the next couple of days :) Planning to submit a version before the weekend.

library(ggblanket)
library(palmerpenguins)
library(tidyverse)

set_blanket(
  col_palette_d = c("red", "blue", "grey"),
  alpha_recursive = 1,
)

penguins |>
  drop_na(sex) |> 
  count(species, sex) |>
  gg_col(
    x = sex,
    y = n,
    col = species,
    label = n,
    mapping = aes_colour_darken(amount = 0.2), # TRICK 1
    position = position_dodge(preserve = "single"),
    width = 0.75,
  ) +
  geom_text(
    mapping = aes_colour_contrast(), # TRICK 2
    position = position_dodge(width = 0.75),
    vjust = 1.5,
    show.legend = FALSE,
  )
#> Scale for colour is already present.
#> Adding another scale for colour, which will replace the existing scale.

Created on 2024-07-23 with reprex v2.1.0