В продолжение моего предыдущего вопроса здесь, используя тот же репрекс, я теперь пытаюсь добавить собственные цвета как к полосам, так и к цвету шрифта метки. Цель состоит в том, чтобы использовать белый цвет шрифта для текстовых меток, когда полоса имеет темный цвет заливки.
Добавление цветов полос в качестве именованного вектора сработало хорошо, но тот же метод не работает для цвета шрифта метки. На изображении ниже цвета месяца 4 и месяца 5 не такие, как предполагалось, и отличаются от цветов других месяцев.
library(dplyr)
library(tibble)
library(plotly)
df <- structure(list(dsc_cat1 = c("Cat1", "Cat1", "Cat2", "Cat1", "Cat1",
"Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2", "Cat1", "Cat1",
"Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat1", "Cat1", "Cat2",
"Cat2"), dsc_cat3 = c("Var 1", "Var 2", "Var 3", "Var 1", "Var 2",
"Var 3", "Var 4", "Var 1", "Var 2", "Var 3", "Var 4", "Var 1",
"Var 2", "Var 5", "Var 3", "Var 1", "Var 2", "Var 3", "Var 1",
"Var 2", "Var 3", "Var 4"), val = c(6200.63, 5358.48, 2417.35,
8022.49, 14852.6, 2417.35, 100.93, 5389.56, 14631.52, 2417.35,
84.39, 5387.66, 18231.84, 632.72, 1325.05, 5387.03, 14852.6,
2417.35, 5377.88, 14087.98, 1510.02, 47.27), mth = c(1, 1, 1,
2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6)), row.names = c(NA,
-22L), class = c("tbl_df", "tbl", "data.frame"))
fill_colours <- setNames(
object = c(
"#304996"
,"#515575"
,"#915f78"
,"#cd6873"
,"#e88c7d"
)
,nm = paste("Var", 1:5)
)
label_colours <- setNames(
object = c(
"white"
,"white"
,"white"
,"black"
,"black"
)
,nm = paste("Var", 1:5)
)
subplot(
lapply(unique(df$mth), function(m) {
data <- df %>%
mutate(val = ifelse(mth==m, val, 0)) %>%
arrange(dsc_cat1)
x_title <- paste("Month", m)
show_legend = ifelse(m == 1, TRUE, FALSE)
plot_ly(data = data,
x = ~dsc_cat1,
y = ~val,
type = "bar",
legendgroup=~dsc_cat3,
text = ~val,
textfont = list(size = 12, color = label_colours),
textposition = "auto",
color = ~dsc_cat3,
colors = fill_colours,
showlegend=show_legend
) %>%
layout(xaxis = list(title = x_title))
}), titleX = TRUE, shareY = TRUE) %>%
layout(barmode = 'stack', showlegend = TRUE)
Затем я присоединил цвета меток к исходным данным, чтобы график мог считывать цвета непосредственно из данных. Как видно из изображения ниже, цвета для Var 3
должны быть белыми, а для месяцев 3 и 6 метки — черными.
df <- df %>%
left_join(
y = enframe(label_colours)
,by = c("dsc_cat3" = "name")
)
subplot(
lapply(unique(df$mth), function(m) {
data <- df %>%
mutate(
val = ifelse(mth==m, val, 0)
) %>%
arrange(dsc_cat1)
x_title <- paste("Month", m)
show_legend = ifelse(m == 1, TRUE, FALSE)
plot_ly(data = data,
x = ~dsc_cat1,
y = ~val,
type = "bar",
legendgroup=~dsc_cat3,
text = ~val,
textfont = list(size = 12, color = ~value),
textposition = "auto",
color = ~dsc_cat3,
colors = fill_colours,
showlegend=show_legend
) %>%
layout(xaxis = list(title = x_title))
}), titleX = TRUE, shareY = TRUE) %>%
layout(barmode = 'stack', showlegend = TRUE)
Любая помощь приветствуется, ТИА.
Вам необходимо упорядочить данные как по cat1, так и по cat3. Я не понимаю на 100%, но думаю, поскольку текстовый шрифт находится в списке, он выбирает все значения и использует их в том порядке, в котором они есть, а не выравнивает их с данными. Если вы arrange
на основе обоих столбцов, по которым отсортированы данные, следует выбрать их в правильном порядке.
См. строку комментария ниже.
subplot(
lapply(unique(df$mth), function(m) {
data <- df %>%
mutate(
val = ifelse(mth==m, val, 0)
) %>%
#### THIS LINE ONLY CHANGE
arrange(dsc_cat1, dsc_cat3)
x_title <- paste("Month", m)
show_legend = ifelse(m == 1, TRUE, FALSE)
plot_ly(data = data,
x = ~dsc_cat1,
y = ~val,
type = "bar",
legendgroup=~dsc_cat3,
text = ~val,
textfont = ~value,
textposition = "auto",
color = ~dsc_cat3,
colors = fill_colours,
showlegend=show_legend
) %>%
layout(xaxis = list(title = x_title))
}), titleX = TRUE, shareY = TRUE) %>%
layout(barmode = 'stack', showlegend = TRUE)
Просто хотел добавить, что хотя решение Сары для этого примера работает отлично, в моих собственных данных нужно упорядочить только одну переменную (вместо двух, как в этом примере). В моих собственных данных, если бы у меня были упорядочены обе переменные, цвета не совпадали. Итак, для тех, кто это читает, попробуйте расположить разные комбинации переменных.
Спасибо @Sarah, это отлично работает! Это поставило меня в тупик на несколько дней..