R: получение шестнадцатеричных цветов из числовых значений c - как определить среднюю точку в градиентной шкале - PullRequest
1 голос
/ 17 февраля 2020

У меня есть вектор цифр c, и я хотел бы преобразовать его в шестнадцатеричные цветовые коды. Цвета должны соответствовать распределению градиента от его возможного минимума (красный; 0), через среднее значение, которое я определяю (среднее значение, черный), до его возможного максимума (зеленый; 1).

С ggplot I будет использовать функцию scale_*_gradientn. Но теперь мне нужны фактические шестнадцатеричные значения, и я изо всех сил пытаюсь их вычислить.

library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.6.2

data <- data.frame("a"=runif(100),
                   "b"=runif(100))


# ggplot example ----------------------------------------------------------

data <- data.frame("a"=runif(100),
                   "b"=runif(100))

mean_a <- mean(data$a)

ggplot(data)+
  geom_point(aes(x=a,
                 y=b,
                 color=a),
             stat="identity")+
  scale_color_gradientn(colors=c("red","black","green"),
                        values=c(0, mean_a, 1))+
  theme(legend.position = NULL)

Отображение функции scale_color_gradientn, очевидно, не путь вперед:

data %>% 
  mutate(color_values=map(a, scale_color_gradientn, 
                          colors=c("red","black","green"),
                          values=c(0, mean_a, 1))) %>% 
  head()
#>           a         b                      color_values
#> 1 0.2863037 0.9902960 <environment: 0x000000001d002f30>
#> 2 0.6169960 0.9527580 <environment: 0x000000001d038798>
#> 3 0.3126825 0.8807853 <environment: 0x000000001d06e098>
#> 4 0.5464037 0.2307841 <environment: 0x000000001d0a39a8>
#> 5 0.5162976 0.8147066 <environment: 0x000000001d0d92a8>
#> 6 0.7519632 0.6821084 <environment: 0x000000001d10cc98>

Создано в 2020-02-17 пакетом представ (v0.3.0)

Я натолкнулся на эту запись SO для функции colorRamp, однако, кажется, что она не предоставляет никакой возможности для определения «средней» точки вручную.

Я также натолкнулся на эту запись on colorspace пакет, который позволяет определить середину. Однако, опять же, я не могу применить его за пределами ggplot.

Благодарен за любую подсказку!

1 Ответ

3 голосов
/ 17 февраля 2020

Вы можете получить шестнадцатеричные значения, следующие за градиентом colorbar в ggplot следующим образом:

gg_build () решение

    set.seed(1)
    data <- data.frame("a"=runif(100),"b"=runif(100))

    mean_a <- mean(data$a)

    p1 <- ggplot(data)+
      geom_point(aes(x=a,
        y=b,
        color=a),
        stat="identity")+
      scale_color_gradientn(
        colors=c("red","black","green"),
        values=c(0, mean_a, 1))+
      theme(legend.position = NULL)

    # get plot build
    build <- ggplot_build(p1)

    # select hex value and x-value data
    hex_df <- build$data[[1]][, c("colour", "x")]

    # order hex value data to follow x-axis
    hex_df_ordered <- hex_df[order(hex_df$x),]

масштаб :: градиент_n_pal () решение

Возможно, вам нужен подход, использующий пакетную функцию scales gradient_n_pal, которая вызывается scale_color_gradientn:

    library(ggplot2)
    library(scales)
    library(ggpubr)

    # create data
    set.seed(1)
    data <- data.frame("a"=runif(100), "b"=runif(100))
    #get mean_a
    mean_a <- mean(data$a)
    # order the data by a
    data <- data[order(data$a),]
    # encode the values in a character variable for reference
    data$a_char <- as.character(data$a)

    # use the scales::gradient_n_pal to create a palette function
    pal <- scales::gradient_n_pal(colours = c("red","black","green"),
      values= c(0, mean_a, 1))
    # use data in a to generate palette-generated values in the data
    data$hex_from_scales <- pal(data$a)

    # plot with scale_color_gradientn
    p1 <- ggplot(data)+
      geom_point(aes(x=a,
        y=b,
        color=a),
        stat="identity", show.legend = F)+
      scale_color_gradientn(colors=c("red","black","green"),values=c(0, mean_a, 1))+
      ggtitle("Using scale_color_gradientn ")+
      theme(legend.position = NULL)

    # plot with scale_color_manual and gradient_n_pal generated hex values
    p2 <- ggplot(data)+
      geom_point(aes(x=a,
        y=b,
        color=a_char),
        stat="identity", show.legend = F)+
      scale_color_manual(values = data$hex_from_scales)+
      ggtitle("Using gradient_n_pal")+
      theme(legend.position = NULL)

    plots <- ggpubr::ggarrange(p1, p2, ncol = 2)

Этот код генерирует эти графики:

Comparison of plots

Заключение

Судя по сходству на двух графиках кажется, что вы можете получить шестнадцатеричные значения вашего вектора цифр c с помощью этого фрагмента:

        # create a palette function
        pal <- scales::gradient_n_pal(colours = c("red","black","green"),values= c(0, mean_a, 1))
        # get palette-generated values from your vector
        data$hex_from_scales <- pal(data$a)

Также примечательно, что это решение генерирует немного другого гекса коды как ggplot_build() решение, предложенное выше. Мои глаза говорят мне, что различия незначительны. Пока не увижу, не поверю!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...