首页 > 解决方案 > Invert the order of the legend

问题描述

I have written a function to create plotly line graphs for my shiny dashboard. The order of the legends do not seem right. For some reason it is showing reverse of what is in the data frame. I want the category 'other' to be placed last in the legend. Is there a way to change the sort the order of the legend?

    plot_maker <- function(df, var, legend_pos = -0.5, legend = TRUE) {
    temp <- df %>%
        pivot_wider(names_from = Year_month, values_from = count) %>%
        ungroup() %>%
        mutate_at(vars(contains("20")), function(x) x / sum(x, na.rm = TRUE)) %>%
        pivot_longer(!(!!sym(var)), names_to = "Year_month", values_to = "value")
    
    temp <- temp %>% inner_join(df %>%
                                    mutate(Year_month = as.character(Year_month)),
                                by = c(var, "Year_month")
    )
    
    temp$Year_month <- factor(temp$Year_month,
                              levels = c(unique(temp$Year_month))
    )
    
    if (sum(temp$value, na.rm = TRUE) == 0) {
        return(plot.new())
    } else {
        p <- plot_ly(
            data = temp,
            y = ~value,
            x = ~Year_month,
            color = ~ (get(var)),
            legendgroup = ~ (get(var)),
            hoverinfo = "text",
            text = ~ paste(
                get(var),
                "<br>Count:", count,
                "<br>PCT:", sprintf("%1.2f%%", 100 * value)
            )
        ) %>%
            add_lines() %>%
            layout(
                yaxis = list(
                    tickformat = "%",
                    title = ""
                ),
                xaxis = list(title = ""),
                legend = list(
                    orientation = "h", yanchor = "bottom", y = legend_pos,
                    font = list(size = 10),
                    traceorder= 'normal'
                ),
                template = "plotly_dark"
            )
        
        if (legend == FALSE){
            p <- p %>% layout(showlegend = FALSE)
        }
        
        return(p)
    }
}

Running the function

plot_maker(df1, "therapy_class")

Here is the test data (df1)

structure(list(therapy_class = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L), .Label = c("ALK Inhibitors", 
"Anti-VEGF-based therapies", "EGFR TKIs", "EGFR-antibody based therapies", 
"Non-platinum-based chemotherapy combinations", "IO-based therapies", 
"Platinum-based chemotherapy combinations", "Single agent chemotherapies", 
"Other"), class = c("ordered", "factor")), Year_month = structure(c(2020.91666666667, 
2021, 2021.08333333333, 2021.16666666667, 2021.25, 2021.33333333333, 
2020.91666666667, 2021, 2021.08333333333, 2021.16666666667, 2021.25, 
2021.33333333333, 2020.91666666667, 2021, 2021.08333333333, 2021.16666666667, 
2021.25, 2021.33333333333, 2021.08333333333, 2021.16666666667, 
2020.91666666667, 2021, 2021.08333333333, 2021.16666666667, 2021.25, 
2021.33333333333, 2020.91666666667, 2021, 2021.08333333333, 2021.16666666667, 
2021.25, 2021.33333333333, 2020.91666666667, 2021, 2021.08333333333, 
2021.16666666667, 2021.25, 2021.33333333333, 2020.91666666667, 
2021, 2021.08333333333, 2021.16666666667, 2021.25, 2021.33333333333, 
2020.91666666667, 2021, 2021.08333333333, 2021.16666666667, 2021.25, 
2021.33333333333), class = "yearmon"), count = c(18L, 17L, 16L, 
15L, 15L, 15L, 37L, 39L, 38L, 47L, 48L, 32L, 63L, 45L, 64L, 73L, 
63L, 57L, 1L, 1L, 6L, 5L, 5L, 12L, 2L, 8L, 312L, 327L, 296L, 
371L, 324L, 307L, 127L, 115L, 99L, 148L, 124L, 141L, 69L, 51L, 
48L, 66L, 58L, 38L, 45L, 44L, 34L, 43L, 64L, 52L)), row.names = c(NA, 
-50L), groups = structure(list(therapy_class = structure(1:9, .Label = c("ALK Inhibitors", 
"Anti-VEGF-based therapies", "EGFR TKIs", "EGFR-antibody based therapies", 
"Non-platinum-based chemotherapy combinations", "IO-based therapies", 
"Platinum-based chemotherapy combinations", "Single agent chemotherapies", 
"Other"), class = c("ordered", "factor")), .rows = structure(list(
    1:6, 7:12, 13:18, 19:20, 21:26, 27:32, 33:38, 39:44, 45:50), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -9L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

enter image description here

标签: rplotlylegend

解决方案


p <- plot_ly(
            data = temp,
            y = ~value,
            x = ~Year_month,
            color = ~ (get(var)),
            legendgroup = ~ (get(var)),
            hoverinfo = "text",
            text = ~ paste(
                get(var),
                "<br>Count:", count,
                "<br>PCT:", sprintf("%1.2f%%", 100 * value)
            )
        ) %>%
            add_lines() %>%
            layout(
                yaxis = list(
                    tickformat = "%",
                    title = ""
                ),
                xaxis = list(title = ""),
                legend = list(
                    orientation = "h", yanchor = "bottom", y = legend_pos,
                    font = list(size = 10),
                    traceorder= 'reversed'
                ),
                template = "plotly_dark"
            )

推荐阅读