2016-10-16 1 views
9

rplotly을 사용하여 여러 개의 서브 도표를 생성합니다. 장난감의 예를 아래에 나타냅니다.하나의 범례가 모든 차트를 제어 할 수 있도록 서브 도표를 표시하는 범례 그룹

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) 

나는 전설에 '잘라 내기'를 클릭하면 표시/것이라는 전설은하고 싶다은 모두 차트 대신의 전설과 관련된 단지 차트에서 '잘라 내기'고 숨 깁니다.

DefaultVsIdeal

나는 legendgroup 보았다하지만 (내가 줄거리를 만들기 위해 사용하고 그룹화가 clarity) cut 대신 clarity와 연결하는 방법을 알아낼 수 없습니다.

는 또한이 솔루션은 원료 plot_ly 작동하지 ggplotlyggplotly에서 사용할 수 없습니다 내가 필요로하는 다른 plot_ly 기능이 있기 때문에 할 필요가있다.

도움이 될만한 의견이 있습니다. plotly_4.5.2, dplyr_0.5.0shiny_0.14을 사용하고 있습니다.

+0

당신이 plotly 4.0에서'더 나은 연습을 시도하고이 답변에 above.' 않았다 'https://stackoverflow.com/a/41122127/2296728 ' – urwaCFC

답변

1

좋아, 여기 ggplot2를 사용하는 솔루션은 다음과 같습니다

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

고마워! 불행히도'plot_ly'가 아닌'plot_ly'가 아닌'plot_ly' 함수들이'ggplotly'에서 사용할 수 없기 때문에 원시'plot_ly'를 사용하는 솔루션을 찾고 있습니다. 그걸 더 분명하게해라. – adilapapaya

+1

@adilapapaya "R"에서 적어도 (지금까지) 가능하지 않다고 생각합니다. 'python' 또는'matlab'에서 가능한지 여부를 확인하는 데 도움이 될 수 있습니다. 소프트웨어 간에는 몇 가지 차이점이 있습니다. – Jimbou

+0

@adilapapaya이 문제도 발생합니다. 솔루션을 제안 할 수 있었습니까? – Danny

0

한번에 모두 흔적에 legendgroup = ~cut를 추가하고 그 중 하나 showlegend = F 설정. 그런 다음 레이아웃이 같은 showlegend = T

을 설정

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

내가이 일을 할 때 나는 전설을 잃는다. – adilapapaya