交互式地选择一个分组变量

时间:2018-07-10 09:05:31

标签: r plotly

如何在具有下拉列表(或其他内容)的绘图中创建分组条形图,以便查看者可以选择分组变量?

工作示例:

library(dplyr)
library(plotly)
library(reshape2)

iris$Sepal.L <- iris$Sepal.Length %>%
  cut(breaks = c(4,5,7,8),
      labels = c("Length.a","Length.b","Length.c"))
iris$Sepal.W <- iris$Sepal.Width %>%
  cut(breaks = c(1,3,5),
      labels = c("Width.a","Width.b"))

# Get percentages
data1 <- table(iris$Species, iris$Sepal.L) %>% 
  prop.table(margin = 1)
data2 <- table(iris$Species, iris$Sepal.W) %>% 
  prop.table(margin = 1)

# Convert to df
data1 <- data.frame(Var1=row.names(data1), cbind(data1))
row.names(data1) <- NULL
data2 <- data.frame(Var1=row.names(data2), cbind(data2))
row.names(data2) <- NULL

plot_ly(
  data = data1,
  name = "Length.a",
  x = ~Var1, y = ~Length.a,
  type = "bar") %>% 
  add_trace(y=~Length.b, name = "Length.b") %>% 
  add_trace(y=~Length.c, name = "Length.c")
plot_ly(
  data = data2,
  name = "Width.a",
  x = ~Var1, y = ~Width.a,
  type = "bar") %>% 
  add_trace(y=~Width.b, name = "Width.b")

例如,如果我想在查看带表的绘图(iris $ Species,iris $ Sepal.Length)和带表的绘图(iris $ Species,iris $ Sepal.Width)之间进行选择 enter image description here enter image description here

奖金:
如果容易的话能够交互选择x变量也很酷,但这不是必需的。

1 个答案:

答案 0 :(得分:1)

您可以找到解决方案here。 想法是将您的条形图(data1data2)全部绘制在一起,一次只显示一个。

items <- list(
           list(label="Var1", 
                args=list(list(visible=c(T,T,T,F,F)))),          
           list(label="Var2", 
                args=list(list(visible=c(F,F,F,T,T))))
         )

plot_ly(data=data1) %>%
  add_bars(name = "Length.a",
  x = ~Var1, y = ~Length.a, visible=T) %>%
  add_bars(name = "Length.b",
  x = ~Var1, y = ~Length.b, visible=T) %>%
  add_bars(name = "Length.c",
  x = ~Var1, y = ~Length.c, visible=T) %>%
  add_bars(name = "Width.a",
  x = ~Var1, y = ~Width.a, visible=F, data=data2, marker=list(color="#377EB8")) %>%
  add_bars(name = "Width.b",
  x = ~Var1, y = ~Width.b, visible=F, data=data2, marker=list(color="#FF7F00")) %>%
  layout(
    title = "Bar chart with drop down menu",
    xaxis = list(title="x"),
    yaxis = list(title = "y"),
    showlegend = T,
    updatemenus = list(
      list(y = 0.9,
           buttons = items)
    ))

enter image description here enter image description here