Как исправить неправильные цвета с помощью Plotly, когда столбец содержит «NA» - PullRequest
0 голосов
/ 03 ноября 2019

Когда столбцы содержат значения 'NA', тогда Plotly меняет цвета, которые я назначаю для линий и маркеров. Есть какие нибудь идеи как это починить? Спасибо! (Я использую версию R «3.6.0 (2019-04-26)» и версию Plotly «4.9.0»)

Данные для первого графика содержат некоторые значения «NA» для «trust_ecb»столбец, который наносится на ось Y. Цвета для линий и маркеров неверны, т.е. отличаются от цветов, назначенных в коде.

Однако, когда я затем перекодирую значения 'NA' в '70' и построю график, цвета будут правильными.

График с неправильными цветами (столбец «trust_ecb» содержит NA).
график с правильными цветами (столбец «trust_ecb» не содержит NA)

#Creating dataframe
trust_eur_cyp <- structure(list(year = c(2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 
                    2015L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2009L, 
                    2010L, 2011L, 2012L, 2013L, 2014L, 2015L), group = structure(c(4L, 
                                                                                   4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 1L, 1L, 1L, 
                                                                                   1L, 1L, 1L, 1L), .Label = c("Cypriots", "EU-15", "EU-25", "Greek-Cypriots", 
                                                                                                               "Turkish-Cypriots"), class = "factor"), trust_ecb = c(53.2, 50.2, 
                                                                                                                                                                     44, 33.7, 10.9, 23.2, 19.3, 29.1, 42.1, 36.6, 41.8, 48.1, NA, 
                                                                                                                                                                     NA, 48.8, 48.7, 42.7, 35.1, 17.5, NA, NA)), row.names = c(6L, 
                                                                                                                                                                                                                               7L, 8L, 9L, 10L, 11L, 12L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 
                                                                                                                                                                                                                               36L, 37L, 38L, 39L, 40L, 41L, 42L), class = "data.frame")




#Creating plots
library(plotly)

plot_trust_ecb_cyp <- plot_ly(trust_eur_cyp, y = ~trust_ecb, x= ~year, color = ~group, type = "scatter",
                          mode = "lines+markers",
                          line = list(color = factor(trust_eur_cyp$group, labels = c("FFCF00","9702A7","00A876")), width = 3), 
                          marker = list(color = factor(trust_eur_cyp$group, labels = c("FFCF00","9702A7","00A876")), size = 6),
                          legendgroup = ~group, showlegend = T) %>%
  layout(yaxis = list(title = "%  'Tend to Trust'", titlefont=list(size=20), range = c(0,80), tickfont = list(size = 16)),
     xaxis = list(title = "", dtick = 2, tickfont = list(size = 16)))  

#Recoding 'NA' to '70' to show that now colors in plots are correct
trust_eur_cyp$trust_ecb[is.na(trust_eur_cyp$trust_ecb)] <- 70

#Rerun plotly code above.

1 Ответ

0 голосов
/ 04 ноября 2019

Я бы создал вектор с цветами для разных групп по желанию. Затем присвойте ему colors в plot_ly. Поскольку существуют неиспользуемые уровни факторов, для ясности я сначала отбросил их и использовал те же 3 цвета, что и вы. Я считаю, что это работает с вашими пропущенными значениями.

trust_eur_cyp$group <- droplevels(trust_eur_cyp$group)

pal <- c("#9702A7", "#00A876", "#FFCF00")

plot_trust_ecb_cyp <- plot_ly(trust_eur_cyp, y = ~trust_ecb, x= ~year, color=~group, colors = pal,
                              type = "scatter",
                              mode = "lines+markers",
                              line = list(width = 3), 
                              marker = list(size = 6),
                              legendgroup = ~group, showlegend = T) %>%
  layout(yaxis = list(title = "%  'Tend to Trust'", titlefont=list(size=20), range = c(0,80), tickfont = list(size = 16)),
         xaxis = list(title = "", dtick = 2, tickfont = list(size = 16)))

plot_ly with NAs

...