У меня есть dataframe
df
с координатами 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"))
Используйте собственную палитру, удобную для дальтоников: см. stackoverflow.com/q/66748997/680068 и r-graph-gallery.com/color-palette-finder
@Limey: большое спасибо за ссылки. К сожалению, ни один из них не описывает, как объединить 3 относительных значения в одной карте, такой как rgb(), чтобы мы могли визуализировать вклад каждого параметра с соответствующим вкладом цвета.
@ zx8754 то же самое (см. комментарий выше, я не мог там вас упомянуть)
Похоже, у ggtern есть темы для дальтоников, вы пробовали? theme_bvbw - A black/vermillion/blue theme with white background, for colorblind sensitive readers
С R 4.0.0
все изменилось: с тех пор палитры по умолчанию хороши. С удовольствием прочитала Journal.r-project.org/articles/RJ-2023-071
@ zx8754 на рисунке, показанном в сообщении, графики ggtern
и ggplot2
«отдельные». Основной сюжет требует своего решения :)
@Friede интересный пост, но он не затрагивает описанную выше проблему :)
Сначала я создаю матрицу со значениями 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
(воспроизводимый пример)? Вы правы, кажется, цвета, которые я выбрал, не очень хорошо сочетаются с этим примером. Если я знаю, как добраться до матрицы, я мог бы попробовать другие цвета :)
Существует несколько пакетов с функциями преобразования шестнадцатеричных чисел в десятичные sRGB. Я отредактировал, добавив пример из пакета colorspace
, где данные удобно возвращаются в виде матрицы в слоте coords
объекта sRGB
.
Спасибо! знаете, почему axis.text = element_blank()
не удаляет тексты в legend_plot
?
(он каким-то образом работает с оригинальным примером RGB)
Я не слишком знаком с ggtern
, но смог убрать метки/галочки, установив breaks = NULL
на шкале позиций. Я отредактировал ответ, чтобы показать код легенды и график без надписей.
Вы смотрели на семейство
brewer
весов? Здесь и здесь?