Plotly: как настроить цвета в гистограмме? - PullRequest
1 голос
/ 22 января 2020

Я хотел бы спросить вас, не могли бы вы помочь мне в настройке цветов в столбчатой ​​диаграмме с накоплением , созданной плотно.

Проблема заключается в следующем - мне нужно заново создать панель управления (из файла Excel в файл html). Часть информационной панели представляет собой диаграмму, предоставляющую нам информацию о раннем производстве каждого объекта. Диаграмма представляет собой гистограмму с накоплением по графику. Поскольку каждая сущность определяется определенным c цветом (определенным в RGB) на всей панели инструментов, мне необходимо также сохранить эти цвета в кольцевой диаграмме. Но существует проблема. Я всегда получаю следующее предупреждение:

Предупреждающее сообщение: В RColorBrewer :: brewer.pal (N, «Set2»): n слишком большое, максимально допустимый для палитры Set2 равен 8 Возвращая палитру, которую вы спросили поскольку с таким количеством цветов

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

Есть идеи, что с этим делать? Заранее большое спасибо.

Код:

library(dplyr)
library(plotly)

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,
          type = "bar",
          color = ~Entity,
          marker = list(colors = ~EntityColor)
  ) %>%

  layout(yaxis = list(title = ""),
         xaxis = list(title = ""),
         barmode = 'stack')

Сюжет:

enter image description here

1 Ответ

1 голос
/ 22 января 2020

Уточненный подход после комментариев:

Поскольку цвета оказались немного хитрыми (см. Первоначальное предложение ниже), мне пришлось разбить все на части и использовать комбинацию plot_ly() и add_traces() в al oop, чтобы убедиться, что настройки графика не применяют цвета в неправильном порядке. Следующий сюжет должен быть именно тем, что вы ищете.

Сюжет:

enter image description here

Обратите внимание, что я добавил непрерывный числовой столбец 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

Первоначальное предложение

Вот первоначальное предложение. Прежде всего, 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

Код:

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')

Посмотрите, как это работает для вас.

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