Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

plotly crosstalk filter is filtering wrong, leaking values from other categories from variable

When using filter_select for categorical variables, crosstalk is not filtering properly, taking values from other categories.

Reproducible example:


df <- structure(list(weight = c(0.349, 0.336, 0.329, 0.331, 0.329, 
 0.329, 0.321, 0.317, 0.317, 0.349, 0.351, 0.353, 0.355, 0.355, 
 0.355, 0.355, 0.356, 0.356, 0.358, 0.356, 0.356), value = c("housewife", 
    "Merchant", "Unknown", "Technologist", 
   "Admin", "Student", "Social worker", "Unemployed", 
   "Consultant", "Home", "Food", 
  "Engineering", "Real Estate", "Tourism", "Repairment", "Transport", 
   "Navy", "Military", "Security", "Distribution", "Restaurant"
 ), variable = c("work", "work", "work", 
                 "work", "work", "work", "work", "work", 
                  "work", "sector", "sector", "sector", "sector", 
                  "sector", "sector", "sector", "sector", "sector", 
                   "sector", "sector", "sector")), class = "data.frame",
          row.names = c(NA,-21L))

>  df
   weight         value variable
1   0.349     housewife     work
2   0.336      Merchant     work
3   0.329       Unknown     work
4   0.331  Technologist     work
5   0.329         Admin     work
6   0.329       Student     work
7   0.321 Social worker     work
8   0.317    Unemployed     work
9   0.317    Consultant     work
10  0.349          Home   sector
11  0.351          Food   sector
12  0.353   Engineering   sector
13  0.355   Real Estate   sector
14  0.355       Tourism   sector
15  0.355    Repairment   sector
16  0.355     Transport   sector
17  0.356          Navy   sector
18  0.356      Military   sector
19  0.358      Security   sector
20  0.356  Distribution   sector
21  0.356    Restaurant   sector

df <- highlight_key(df)

library(plotly)
library(crosstalk)

widgets <- bscols(
  widths = c(12),
  filter_select("variable", "Choose Variable", df, ~variable)
)
bscols(
  widths = c(2,10), widgets, 
  plotly::plot_ly(df, y = ~ weight, x = ~ value) %>%
    add_lines() %>%
    layout(xaxis = list(nticks = 10,
                        tickformat = ".2f")
           , showlegend = F)  )

I get the following wrong Output:

enter image description here

like image 989
Forge Avatar asked Nov 24 '25 07:11

Forge


1 Answers

You need to define the categories on the x-axis with categoryarray and categoryorder. In your example you might mistake xaxis for yaxis.

Futhermore add_lines will connect the weight (y-values) in alphabetical order of value (x-values). Therefore add_lines needed to be replaced with add_paths or type = "scatter", mode = "lines".

Code

df <- highlight_key(df)

widgets <- bscols(
  widths = c(12),
  filter_select("variable", "Choose Variable", df, ~variable)
)

bscols(
  widths = c(2,10),
  widgets,
  plotly::plot_ly(df, y = ~ weight, x = ~ value,
                  type = "scatter", mode = "lines") %>%
    layout(xaxis = list(type = 'category',
                        categoryarray =  ~value,
                        categoryorder = "array"),
           yaxis = list(nticks = 10,
                        tickformat = ".2f"),
           showlegend = F))  

Plots enter image description here

like image 142
tamtam Avatar answered Nov 26 '25 23:11

tamtam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!