2016-10-16 55 views
9

r içinde plotly kullanıyorum. Bir oyuncak örneği aşağıda gösterilmiştir.Plotly legendgroup subplots için tek bir lejant tüm grafikleri kontrol eder

library(shiny) 
library(dplyr) 
library(plotly) 

## Toy Example 
ui <- fluidPage(
    h3("Diamonds"), 
    plotlyOutput("plot", height = 600) 
) 

server <- function(input, output, session) { 

    # reduce down the dataset to make the example simpler 
    dat <- diamonds %>% 
    filter(clarity %in% c("I1", "IF")) %>% 
    mutate(clarity = factor(clarity, levels = c("I1", "IF"))) 

    output$plot <- renderPlotly({ 

    # Generates the chart for a single clarity 
    byClarity <- function(df){ 

     Clarity <- df$clarity[1]; 

     plot_ly(df, x = ~carat, y = ~price, color = ~cut, name = ~clarity) %>% 
     add_trace(
      type="bar" 
      ## Also tried adding this with no success 
      # legendgroup = ~cut 
     ) %>% 
     layout(
      barmode = "stack" 
     ) 
    } 

    dat %>% 
     split(.$clarity) %>% 
     lapply(byClarity) %>% 
     subplot(nrows = NROW(.), shareX = TRUE, which_layout = "merge") 
    }) 
} 

shinyApp(ui, server) 

Bir efsane 'Cut' tıklayarak/göstereceğine efsaneler böyle yapmak istiyorum hem çizelgeleri yerine o efsane ile ilişkili sadece grafikten 'Kes' olduğunu gizlemek.

DefaultVsIdeal

Ben legendgroup baktım ama (ben subplots yapmaya kullanıyorum gruptur clarity) cut yerine clarity ile ilişkilendirmek anlamaya olamaz.

Ben de çözüm çiğ plot_ly ile çalışmak değil, ggplotlyggplotly bulunmayan ihtiyacım diğer plot_ly işlevleri olduğu gibi gerek.

Herhangi bir yardım için teşekkür ederiz. plotly_4.5.2, dplyr_0.5.0 ve shiny_0.14 kullanıyorum.

+0

sen plotly 4.0 altında 'Daha iyi uygulama denemek ve bu yanıtında above.' mü: ' https://stackoverflow.com/a/41122127/2296728 – urwaCFC

cevap

1

Tamam, burada ggplot2 kullanarak bir çözümdür:

library(ggplot2) 
library(dplyr) 
library(plotly) 
dat <- diamonds %>% 
    filter(clarity %in% c("I1", "IF")) %>% 
    mutate(clarity = factor(clarity, levels = c("I1", "IF"))) 
# Function for nice labels 
k_label <- function(x) { 
c(0, paste0((x)/1000,"K")[-1]) 
} 
# ggplot 
p <- ggplot(dat,aes(x=carat, y=price, fill=cut)) + 
      geom_bar(stat="identity") + 
      facet_wrap(~clarity,nrow=2, scales = "free_y") + 
      scale_y_continuous(labels = k_label) + 
      theme_minimal() + ylab("") + xlab("") + 
      theme(legend.title=element_blank(), 
       panel.grid.major.x=element_blank()) 
# a plotly 
ggplotly(p) 

enter image description here

+0

Teşekkürler! Ne yazık ki, 'ggplotly''de mevcut olmayan diğer' plot_ly' işlevleri var gibi ham 'plot_ly' ve' ggplotly'' ile çalışan bir çözüm arıyorum ... Ben soru güncellemek için bunu daha net hale getir. – adilapapaya

+1

@adilapapaya Hala en azından R'de mümkün olmadığını düşünüyorum (şimdiye kadar). “Python” veya “matlab” ın mümkün olup olmadığını kontrol etmek yararlı olabilir. Yazılımlar arasında bazı farklılıklar vardır. – Jimbou

+0

@adilapapaya Bu problemle de karşılaşıyorum, bir çözüm buldunuz mu hiç? – Danny

0

deneyin hem izleri için legendgroup = ~cut ekleme ve onlardan biri için showlegend = F ayarı. Sonra düzeninde Bunun gibi showlegend = T

ayarlayın:

plot_ly(df, x = ~carat, y = ~price, color = ~cut, name = ~clarity, legendgroup = ~cut, showlegend = T) %>% 
    add_trace(type="bar", legendgroup = ~cut, showlegend = F) %>% 
    layout(
     barmode = "stack",showlegend = T 
    ) 
+1

Bunu yaptığımda, efsaneyi tamamen kaybediyorum ... – adilapapaya