Как заставить одинаковые цвета для всех участков в сюжете в заговоре? - PullRequest
0 голосов
/ 01 декабря 2018

В следующем примере у меня есть четыре прямоугольника в рамках сюжета.Каждый из четырех графиков в этом примере имеет 3 переменные: акции, облигации и денежные средства.На каждом из графиков я хотел бы, чтобы акции отображались одинаковым цветом (например, синим цветом), облигации - одинаковым цветом (например, красным), а наличные - третьим цветом.Приведенный ниже код дает мне 12 цветов, а не 3. Я сделал простой пример.В моей реальной задаче количество переменных будет определяться во время выполнения, поэтому я не могу жестко запрограммировать цвета.Я хотел бы позвонить в палитру.

library(RColorBrewer)
library(plotly)
set.seed(101)
tbl1y <- data.frame(stocks = rnorm(1000,10,15),
                   bonds = rnorm(1000, 7, 8),
                   cash = rnorm(1000,3,1))
tbl3y <- data.frame(stocks = rnorm(1000,10,15*0.75),
                    bonds = rnorm(1000, 7, 8*0.75),
                    cash = rnorm(1000,3,1*0.75))
tbl5y <- data.frame(stocks = rnorm(1000,10,15*0.5),
                    bonds = rnorm(1000, 7, 8*0.5),
                    cash = rnorm(1000,3,1*0.5))
tbl10y <- data.frame(stocks = rnorm(1000,10,15*0.25),
                    bonds = rnorm(1000, 7, 8*0.25),
                    cash = rnorm(1000,3,1*0.25))

create_1boxplot <- function(tbl, n, vnames){
    mypalette <- brewer.pal(length(vnames), "Dark2")
    p <- plot_ly(data = tbl, type="box")
    for(i in vnames){
        p <- p %>% 
            add_trace(y = tbl[,i], name = i)
    }
    a<-list(text=paste("Boxplot of", n, "Year Returns"),
            xref = "paper",
            yref = "paper",
            yanchor = "bottom",
            xanchor = "center",
            color = vnames,
            colors = mypalette,
            align = "left",
            valign = "top",
            x = 0.5,
            y = 1,
            showarrow = FALSE)
    p <- p %>% layout(annotations=a)
    return(p)
}

vnames <- c("stocks", "bonds", "cash")
p1 <- create_1boxplot(tbl1y, 1, vnames = vnames)
p3 <- create_1boxplot(tbl3y, 3, vnames = vnames)
p5 <- create_1boxplot(tbl5y, 5, vnames = vnames)
p10 <- create_1boxplot(tbl10y, 10, vnames = vnames)

subplot(p1, p3, p5, p10, titleX=FALSE, titleY=FALSE, nrows=2, margin=0.05) %>%
    layout(showlegend = FALSE,
           yaxis = list(title = ""), 
           xaxis = list(title = ""))

enter image description here

1 Ответ

0 голосов
/ 02 декабря 2018

Решение можно найти здесь .Вкратце, добавьте 1 к первому параметру (n) вызова функции brewer.pal;и добавьте colorway=mypalette к вызову layout в функции create_1boxplot.

...