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:
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))