Уточненный подход после комментариев:
Поскольку цвета оказались немного хитрыми (см. Первоначальное предложение ниже), мне пришлось разбить все на части и использовать комбинацию plot_ly()
и add_traces()
в al oop, чтобы убедиться, что настройки графика не применяют цвета в неправильном порядке. Следующий сюжет должен быть именно тем, что вы ищете.
Сюжет:
![enter image description here](https://i.stack.imgur.com/w8Ouk.png)
Обратите внимание, что я добавил непрерывный числовой столбец ID
. Почему? Потому что вы хотели, чтобы имена были в алфавитном порядке, а строки добавлялись на график в том порядке, в котором они отображаются в вашем источнике. И это немного сложно, так как прямой заказ с использованием dt %>% arrange((Entity))
даст вам Entity1, Enitity10, Entity11
et c. Дайте мне знать, если вы хотите отрегулировать это любым другим способом.
Код:
library(dplyr)
library(plotly)
# data
set.seed(123)
dt <- as.data.frame(matrix(ncol = 13, nrow = 19))
colnames(dt) <- c("Entity", month.abb)
for (i in 1:nrow(dt)) {
dt[i, 1] <- paste("Entity", i, sep="")
dt[i, -1] <- floor(runif(12, min=0, max=100))
}
# assign colors to entities
dt$"EntityColor" <- c("#074263", "#0B5394", "#3D85C6", "#6D9EEB", "#A4C2F4", "#CFE2F3", "#5B0F00", "#85200C", "#A61C00", "#CC4125", "#DD7E6B", "#E6B8AF", "#F8CBAD", "#F4CCCC", "#274E13", "#38761D", "#E06666", "#CC0000", "#20124D")
# sort data
dt$ID <- seq.int(nrow(dt))
dt <- dt %>% arrange(desc(ID))
# specify month as factor variable to ensure correct order
months=names(dt)[2:13]
months<- factor(months, levels = c(months))
# plotly setup
p <- plot_ly(type = 'bar')
# add trace for each entity
nrows = nrow(dt)
for(i in 1:nrows) {
p <- p %>% add_trace(x=months, y = unlist(dt[i,2:13], use.names=F), type = 'bar',
#name = paste(dt[i,1], dt[i,14], sep = "_"),
name = dt[i,1],
type = 'bar',
marker=list(color = dt[i,14])) %>%
layout(barmode = 'stack')
}
# Edit layout
p <- p %>% layout(title = list(xanchor='right', text='Correct colors, orderered legend'),
yaxis = list(title = ''),
xaxis = list(title = 'month'))
p
Проверка правильности цвета:
![enter image description here](https://i.stack.imgur.com/Z7on0.png)
Первоначальное предложение
Вот первоначальное предложение. Прежде всего, color = ~Entity
добрался до go. И marker = list(color = ~EntityColor)
против marker = list(colors = ~EntityColor)
дает два разных результата. Что делает даже странным то, что p ie документация диаграммы использует:
marker = list(colors = colors, ...)
... и документация гистограммы использует:
marker = list(color = c('rgba(204,204,204,1)', 'rgba(222,45,38,0.8)', ...)
... без s
в конце color
.
В любом случае, вы следует протестировать marker = list(color = ~EntityColor)
и marker = list(colors = ~EntityColor)
и посмотреть, что вам подходит.
Сюжет:
![enter image description here](https://i.stack.imgur.com/1KZPS.png)
Код:
dt <- as.data.frame(matrix(ncol = 13, nrow = 19))
colnames(dt) <- c("Entity", month.abb)
for (i in 1:nrow(dt)) {
dt[i, 1] <- paste("Entity", i, sep="")
dt[i, -1] <- floor(runif(12, min=0, max=100))
}
# assign colors to entities
dt$"EntityColor" <- c("#074263", "#0B5394", "#3D85C6", "#6D9EEB", "#A4C2F4", "#CFE2F3", "#5B0F00", "#85200C", "#A61C00", "#CC4125", "#DD7E6B", "#E6B8AF", "#F8CBAD", "#F4CCCC", "#274E13", "#38761D", "#E06666", "#CC0000", "#20124D")
data.table::melt(dt) %>%
plot_ly(x = ~variable,
y = ~value,
name= ~Entity,
type = "bar",
#color = ~Entity,
marker = list(colors = ~EntityColor)
) %>%
layout(yaxis = list(title = ""),
xaxis = list(title = ""),
barmode = 'stack')
Посмотрите, как это работает для вас.