2
votes

I would like to ask you if you could help me in customizing of colors in a donut chart created by plotly.

The problem is following - I have to recreate a dashboard (from an excel file to a html file). A part of the dashboard is a chart providing us with information about early production of each entity. The chart is a donut chart type by plotly. As each entity is defined by a specific color (defined in RGB) throughout whole dashboard, I need to keep these colors in the donut chart as well. But there is a problem. I always get the following warning:

Warning message: In RColorBrewer::brewer.pal(N, "Set2") : n too large, allowed maximum for palette Set2 is 8 Returning the palette you asked for with that many colors

and the resulting donut chart containts only one Entity with a not-specified color (see attached picture below the code). Also, the colors in legend are not those which are defined.

Any idea what to do with it? Thank you so much in advance.

# create dataset

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

dt

     Entity Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec EntityColor
1   Entity1  60  98  88  66   5   4  10  28  96  12  49  36     #074263
2   Entity2  14   0  54  67  55  95  11  67  82  87  54  83     #0B5394
3   Entity3  71  88  61  57  34  84  75  55  67  99  37  95     #3D85C6
4   Entity4  20  29  14  12  31  33  42  88  47  42  73  74     #6D9EEB
5   Entity5  70  77  60  85  59  69  28  14  53  91   2  86     #A4C2F4
6   Entity6  50  12  72  18  38   2  23  98  61  39  70  36     #CFE2F3
7   Entity7   1  69  86  16  73  61  72  43  85  35  87  86     #5B0F00
8   Entity8  64  58  73  80  38  60  18  66  25  29  89  96     #85200C
9   Entity9  36  49  20  15  54  89  62  94  68  38  60   4     #A61C00
10 Entity10  98  11  61  42  58  87   9  20  75  53  13  65     #CC4125
11 Entity11  78  66  34  30  92   2  59  63   9  74  46  29     #DD7E6B
12 Entity12  21  82  14  80  51  66   5  54   4  38   0  20     #E6B8AF
13 Entity13  22  75  68  91   0  77  99  69  46  20  63  63     #F8CBAD
14 Entity14   7  75  31  15  86  65  64   6  20  75  21  45     #F4CCCC
15 Entity15  65  67  42  55  89  11  20  47   2  26  28  62     #274E13
16 Entity16  79  29  68  30  72  98  54  88  47  80  14  67     #38761D
17 Entity17  41  68   7  59  62  70  36  44  44  94   2  63     #E06666
18 Entity18   5   1  25  99  27  49  16  98  40  18  59  24     #CC0000
19 Entity19  11  20  31  62  93  32  67  81  54  12   6  10     #20124D


# create donut chart

dt %>%
  mutate(Sum = rowSums(dt[, -c(1,ncol(dt))])) %>%

  plot_ly(labels = ~Entity, 
          values = ~Sum,
          textposition = "inside",
          textinfo = 'label+percent',
          color = ~Entity,
          marker = list(color = ~EntityColor)) %>%

  add_pie(hole = 0.4) %>%

  layout(showlegend = T,
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = F),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = F),
         annotations = list(text=sum(rowSums(dt[, -c(1,ncol(dt))])), "showarrow"=F, font=list(size = 40)))

donut chart here

1
How does the second attempt look to you?vestland
It looks how it should look! Great job! Could you share the code with me, please?haraslub
Code in place! Hope it works for you!vestland
@vestland It works! Thank you so much! If I understand it was just about to two addition (adding the type and hole to plot_ly) and one correction (colors instead of color in marker)?haraslub
That's right! And leave out color = ~Entityvestland

1 Answers

1
votes

It turns out you needed to have type='pie' in plot_ly(), comment out color = ~Entity, and specify marker = list(colors = ~EntityColor).

Plot:

enter image description here

Code:

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

dt %>%
  mutate(Sum = rowSums(dt[, -c(1,ncol(dt))])) %>%

  plot_ly(labels = ~Entity, 
          values = ~Sum,
          textposition = "inside",
          textinfo = 'label+percent',
          type='pie',
          hole=0.4,
          #color = ~Entity,
          marker = list(colors = ~EntityColor)
          ) %>% add_pie(hole = 0.4) %>%

  layout(showlegend = T,
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = F),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = F),
         annotations = list(text=sum(rowSums(dt[, -c(1,ncol(dt))])), "showarrow"=F, font=list(size = 40)))

I hope this is what you were looking for. Don't hesitate to let me know if not.