Как визуализировать относительные значения трех параметров с помощью цветов, понятных дальтоникам, на одном рисунке?

У меня есть dataframedf с координатами x и y и еще 3 переменных: a, b и c (воспроизводимые данные см. ниже):

library(tidyverse)

head(df)
# A tibble: 6 × 5
      x     y         a     b     c
  <dbl> <dbl>     <dbl> <dbl> <dbl>
1 -73.5 -40.5 0         0.560 0.440
2 -72.5 -40.5 0.0000947 0.597 0.403
3 -70.5 -40.5 0.00696   0.563 0.430
4 -69.5 -40.5 0.0138    0.513 0.473
5 -68.5 -40.5 0.00644   0.633 0.360
6 -67.5 -40.5 0.00200   0.653 0.345

Параметры a, b и c представляют собой относительные значения вклада каждого соответствующего параметра, и они добавляются к 1. Я хочу визуализировать данные на одном графике, используя ggplot2 с цветами, дружественными для дальтоников.

Что я пробовал до сих пор: я задал этот вопрос ранее и получил отличный ответ . С этим ответом я могу сделать:

library(tidyverse)
library(ggtern)
library(patchwork)

main_plot <- df %>%
        mutate(col = rgb(a, b, c)) %>%
        ggplot(aes(x, y)) +
        geom_tile(aes(fill = col), color = NA) +
        scale_fill_identity() +
        coord_equal() +
        theme_minimal()

df2 <- expand.grid(a = seq(0, 1, 0.01), b = seq(0, 1, 0.01), c = seq(0, 1, 0.01))
df2 <- df2[rowSums(df2) == 1,]
df2$rgb <- rgb(df2$a, df2$b, df2$c)

legend_plot <- ggtern(df2, aes(a, b, z = c, color = rgb)) +
        geom_point() +
        scale_color_identity() +
        scale_L_continuous(labels = function(x) character(length(x))) +
        ggtitle("Relative values") +
        theme(plot.title = element_text(hjust = 0.5),
              axis.text = element_blank())

main_plot + 
        wrap_elements(ggplot_gtable(ggplot_build(legend_plot))) +
        plot_layout(design = "AAAA#
                        AAAAB
                        AAAA#")

который производит:

Однако, когда я применил этот подход, меня раскритиковали за то, что рисунок не очень информативен для людей с нарушениями цвета (дальтонизмом).

Как я могу сделать этот график более дружелюбным к дальтоникам? Например. вместо красного, зеленого и синего я бы хотел использовать оранжевый (#E69F00), небесно-голубой (#56B4E9) и голубовато-зеленый (#009E73).

Воспроизводимые данные:

> dput(df)
structure(list(x = c(-73.5, -72.5, -70.5, -69.5, -68.5, -67.5, 
-66.5, -65.5, -64.5, -63.5, -73.5, -70.5, -69.5, -68.5, -67.5, 
-66.5, -65.5, -70.5, -69.5, -68.5, -67.5, -66.5, -65.5, -70.5, 
-69.5, -68.5, -67.5, -66.5, -65.5, -71.5, -70.5, -69.5, -68.5, 
-67.5, -66.5, -73.5, -71.5, -70.5, -69.5, -68.5, -67.5, -74.5, 
-70.5, -69.5, -68.5, -67.5, -70.5, -69.5, -68.5, -67.5, -66.5, 
-71.5, -70.5, -69.5, -68.5, -67.5, -74.5, -71.5, -70.5, -69.5, 
-68.5, -74.5, -71.5, -70.5, -69.5, -72.5, -71.5, -70.5, -69.5, 
-71.5, -70.5, -69.5, -69.5, -68.5, -67.5, -69.5), y = c(-40.5, 
-40.5, -40.5, -40.5, -40.5, -40.5, -40.5, -40.5, -40.5, -40.5, 
-41.5, -41.5, -41.5, -41.5, -41.5, -41.5, -41.5, -42.5, -42.5, 
-42.5, -42.5, -42.5, -42.5, -43.5, -43.5, -43.5, -43.5, -43.5, 
-43.5, -44.5, -44.5, -44.5, -44.5, -44.5, -44.5, -45.5, -45.5, 
-45.5, -45.5, -45.5, -45.5, -46.5, -46.5, -46.5, -46.5, -46.5, 
-47.5, -47.5, -47.5, -47.5, -47.5, -48.5, -48.5, -48.5, -48.5, 
-48.5, -49.5, -49.5, -49.5, -49.5, -49.5, -50.5, -50.5, -50.5, 
-50.5, -51.5, -51.5, -51.5, -51.5, -52.5, -52.5, -52.5, -53.5, 
-53.5, -54.5, -55.5), a = c(0, 9.46581738186483e-05, 0.00696497150559271, 
0.0137849902303819, 0.00643740569455534, 0.00199816358740475, 
0, 0, 0, 5.06412179534512e-05, 0, 0.0398551254689963, 0.0310856391742892, 
0.0195084547186265, 0.00122115866765995, 0.000262981842424393, 
0.000728947548683327, 0.0180714589486645, 0.0217375647896753, 
0.0302549061176794, 0.0121843041040885, 0.000681282606889494, 
4.35093747206288e-05, 0.0529538781527676, 0.0273285713315873, 
0.0110374092101145, 0.00537239572379284, 0.00472400342189244, 
0.00147365976111469, 0.0259683795649571, 0.0463436806229692, 
0.0267969428070688, 0.020294577628928, 0.00821922974468169, 0.00233230625628307, 
0.00387696973516025, 0.0514313688652839, 0.0645759934429092, 
0.0239569529899347, 0.027534701081013, 0.00534849512202001, 0.00128844338962426, 
0.0426685507779651, 0.0284580643386483, 0.00971006844234354, 
0.00420984206165692, 0.053985050339934, 0.0583984918343995, 0.0172826529268439, 
0.0121423976240239, 0.00547793750320507, 0.0585686295112969, 
0.0340311779773938, 0.0311015513254945, 0.0200707300297805, 0.00957150788475225, 
0.00361466936278744, 0.0527542952718002, 0.0282832440286811, 
0.0177806525711058, 0.00560265899046886, 0.0024828404080448, 
0.0544720394354926, 0.0186537760879564, 0.0192277515814812, 0.00863003055518693, 
0.0249790371500353, 0.015538215176512, 0.0348873548749255, 0.0206759639364579, 
0.0139234477581141, 0.0205576837132205, 0.0404500818602786, 0.00653946544041233, 
0.0223237332992225, 0.0075707047472664), b = c(0.55973614025667, 
0.5970202227548, 0.563477650463872, 0.513046833650201, 0.633380146860311, 
0.653109185283395, 0.704255523998351, 0.596896242072055, 0.520747918302268, 
0.526828987547501, 0.592212337251761, 0.590540320713732, 0.480335397306457, 
0.631079557708342, 0.6667829974047, 0.64403959660305, 0.591513715061531, 
0.572154253402492, 0.506765134717002, 0.664156380590966, 0.67826734460919, 
0.649022944246854, 0.651215734871819, 0.488798113249405, 0.458045272783363, 
0.693687132763554, 0.700613923064021, 0.751238707050007, 0.712027653396489, 
0.532585134221796, 0.476479299998232, 0.490080331523103, 0.705251451061017, 
0.735714385706559, 0.607922959590343, 0.613134683073939, 0.487692533841504, 
0.548015750900016, 0.509952441369207, 0.74439726199284, 0.690392471171559, 
0.588966236272818, 0.659362140614673, 0.646180042358758, 0.631416450548492, 
0.585094155496678, 0.604202144807992, 0.647823791170224, 0.599329297279972, 
0.725121813884829, 0.650627029395497, 0.542872019089378, 0.65883061118346, 
0.66671626220512, 0.639294598531845, 0.622768680020925, 0.479380596605895, 
0.580708446644663, 0.579879141984736, 0.617496249696512, 0.483541553869077, 
0.474759409900493, 0.42759500296535, 0.444245282360467, 0.491426697536639, 
0.543068445843191, 0.354391820625675, 0.285449114670143, 0.230667732146117, 
0.545516189964805, 0.549909364018411, 0.518094993608081, 0.580561287344482, 
0.591327797599958, 0.52693632685116, 0.64278661995468), c = c(0.44026385974333, 
0.402885119071382, 0.429557378030536, 0.473168176119417, 0.360182447445134, 
0.3448926511292, 0.295744476001649, 0.403103757927945, 0.479252081697732, 
0.473120371234546, 0.407787662748239, 0.369604553817271, 0.488578963519254, 
0.349411987573031, 0.33199584392764, 0.355697421554526, 0.407757337389786, 
0.409774287648843, 0.471497300493323, 0.305588713291354, 0.309548351286721, 
0.350295773146257, 0.34874075575346, 0.458248008597827, 0.514626155885049, 
0.295275458026332, 0.294013681212186, 0.244037289528101, 0.286498686842396, 
0.441446486213247, 0.477177019378799, 0.483122725669829, 0.274453971310055, 
0.256066384548759, 0.389744734153374, 0.3829883471909, 0.460876097293212, 
0.387408255657075, 0.466090605640859, 0.228068036926147, 0.304259033706421, 
0.409745320337558, 0.297969308607362, 0.325361893302593, 0.358873481009164, 
0.410696002441665, 0.341812804852074, 0.293777716995377, 0.383388049793184, 
0.262735788491147, 0.343895033101298, 0.398559351399325, 0.307138210839147, 
0.302182186469385, 0.340634671438375, 0.367659812094323, 0.517004734031317, 
0.366537258083536, 0.391837613986583, 0.364723097732382, 0.510855787140454, 
0.522757749691462, 0.517932957599158, 0.537100941551577, 0.48934555088188, 
0.448301523601622, 0.62062914222429, 0.699012670153345, 0.734444912978957, 
0.433807846098737, 0.436167188223475, 0.461347322678698, 0.37898863079524, 
0.40213273695963, 0.450739939849617, 0.349642675298054)), row.names = c(NA, 
-76L), class = c("tbl_df", "tbl", "data.frame"))

Вы смотрели на семейство brewer весов? Здесь и здесь?

Limey 20.06.2024 11:38

Используйте собственную палитру, удобную для дальтоников: см. stackoverflow.com/q/66748997/680068 и r-graph-gallery.com/color-palette-finder

zx8754 20.06.2024 11:40

@Limey: большое спасибо за ссылки. К сожалению, ни один из них не описывает, как объединить 3 относительных значения в одной карте, такой как rgb(), чтобы мы могли визуализировать вклад каждого параметра с соответствующим вкладом цвета.

bird 20.06.2024 12:02

@ zx8754 то же самое (см. комментарий выше, я не мог там вас упомянуть)

bird 20.06.2024 12:03

Похоже, у ggtern есть темы для дальтоников, вы пробовали? theme_bvbw - A black/vermillion/blue theme with white background, for colorblind sensitive readers

zx8754 20.06.2024 12:30

С R 4.0.0 все изменилось: с тех пор палитры по умолчанию хороши. С удовольствием прочитала Journal.r-project.org/articles/RJ-2023-071

Friede 20.06.2024 12:56

@ zx8754 на рисунке, показанном в сообщении, графики ggtern и ggplot2 «отдельные». Основной сюжет требует своего решения :)

bird 20.06.2024 13:14

@Friede интересный пост, но он не затрагивает описанную выше проблему :)

bird 20.06.2024 13:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала я создаю матрицу со значениями RGB для указанной цветовой палитры.

library(tidyverse)
library(ggtern)
library(patchwork)
library(colorspace)

pal <- c('#E69F00', '#009E73', '#56B4E9')

# Hex to sRGB decimal representation
pal_matrix <- hex2RGB(pal)@coords

rownames(pal_matrix) <- c('orange', 'bluegreen', 'skyblue')
colnames(pal_matrix) <- c('R', 'G', 'B')

pal_matrix
#>                   R         G         B
#> orange    0.9019608 0.6235294 0.0000000
#> bluegreen 0.0000000 0.6196078 0.4509804
#> skyblue   0.3372549 0.7058824 0.9137255

Шестнадцатеричные значения для каждого графика генерируются после умножения [a,b,c] на матрицу палитры.

main_plot <- cbind(df, as.matrix(df[3:5]) %*% pal_matrix) |>
  mutate(col = rgb(R, G, B)) |>
  ggplot(aes(x, y)) +
  geom_tile(aes(fill = col), color = NA) +
  scale_fill_identity() +
  coord_equal() +
  theme_minimal()

df2 <- expand.grid(a = seq(0, 1, 0.01), b = seq(0, 1, 0.01), c = seq(0, 1, 0.01))
df2 <- df2[rowSums(df2) == 1,]

legend_plot <- cbind(df2, as.matrix(df2[1:3]) %*% pal_matrix) |>
  mutate(rgb = rgb(R, G, B)) |> 
  ggtern(aes(a, b, z = c, color = rgb)) +
  geom_point() +
  scale_color_identity() +
  scale_T_continuous(breaks = NULL) +
  scale_L_continuous(breaks = NULL) +
  scale_R_continuous(breaks = NULL) +
  ggtitle("Relative values") +
  theme(plot.title = element_text(hjust = 0.5),
        axis.text = element_blank())

main_plot + 
  wrap_elements(ggplot_gtable(ggplot_build(legend_plot))) +
  plot_layout(design = "AAAA#
                        AAAAB
                        AAAA#")

Я не уверен, что это легче интерпретировать, но, может быть, на полном наборе данных или с другой палитрой?

это выглядит так многообещающе! не могли бы вы показать мне, как добраться до pal_matrix (воспроизводимый пример)? Вы правы, кажется, цвета, которые я выбрал, не очень хорошо сочетаются с этим примером. Если я знаю, как добраться до матрицы, я мог бы попробовать другие цвета :)

bird 21.06.2024 14:34

Существует несколько пакетов с функциями преобразования шестнадцатеричных чисел в десятичные sRGB. Я отредактировал, добавив пример из пакета colorspace, где данные удобно возвращаются в виде матрицы в слоте coords объекта sRGB.

Seth 21.06.2024 15:04

Спасибо! знаете, почему axis.text = element_blank() не удаляет тексты в legend_plot?

bird 21.06.2024 15:48

(он каким-то образом работает с оригинальным примером RGB)

bird 21.06.2024 15:57

Я не слишком знаком с ggtern, но смог убрать метки/галочки, установив breaks = NULL на шкале позиций. Я отредактировал ответ, чтобы показать код легенды и график без надписей.

Seth 21.06.2024 16:29

Другие вопросы по теме