I'm trying to use R plot_ly to create a line chart which lines can be toggled on and off using filter buttons that filter along "Product" and "Chip_type". The idea is that suppliers ("Supplier"/"Supplier_text") supply different kinds of chips ("Chip_type") monthly ("Date") for different product segments of a company ("Product"). To get an overview over the top suppliers, I would like to draw one line per supplier, with the "Supplier_text" displayed in the legend, legend entries sorted descendingly by the abs(number) displayed in front of the "Supplier_text". The data tibble is sorted correctly in that regard. The "Overall" entries refer to the sum of all suppliers for that product.
The full data set is to be found at the end of the post.
sample from dat :
Date(chr) Supplier Supplier_text order(int) Chip_type Product n(chr)
1 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Micro Smartphones 106
2 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Nano Smartphones 16920
3 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 BiMech Smartphones 61216
4 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Titan Smartphones 363698
5 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Quantum Smartphones 50797
6 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Platinum Smartphones 52715
7 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 PlainChip Smartphones 174342
8 2019-11 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Classic Smartphones 9319
9 2019-12 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Micro Smartphones 92
10 2019-12 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 Nano Smartphones 16928
11 2019-12 Overall Smartphones 94757 | 17.9% - Overall Smartphones 1 BiMech Smartphones 40920
17 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Micro Monitors 3
18 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Nano Monitors 1536
19 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 BiMech Monitors 6793
20 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Titan Monitors 45146
21 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Quantum Monitors 7922
22 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Platinum Monitors 5359
23 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 PlainChip Monitors 27390
24 2019-11 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Classic Monitors 1131
25 2019-12 Overall Monitors -33239 | -37.8% - Overall Monitors 2 Micro Monitors 12
33 2019-11 A -17385 | -88.0% - A 3 Titan Smartphones 3619
34 2019-11 A -17385 | -88.0% - A 3 Platinum Smartphones 13
35 2019-11 A -17385 | -88.0% - A 3 Quantum Smartphones 2
To keep the order (and later be able to toggle the correct lines!) I'm looping to add traces to an empty plot_ly object like this:
library(stringr)
library(dplyr)
library(plotly)
# "Rebuilding" the data frame as the loop runs to see if what the loop does to the traces ends up being the same (order) as the original data frame. For that, I create an empty object first:
dat_plotly_object_copy = c()
plotly_object <- plot_ly()
id = 1
# I loop along "order", which marks all data of a single supplier:
for(id in 1:max(dat$order)){
dat_one_supplier <- filter(dat, order == id)
plotly_object <- plotly_object %>% add_trace(., data = dat_one_supplier,
# I filter the data set by supplier, to be able to create a line along the dates (~x) per supplier (~Supplier_text) and Chip_type (~n):
x = ~Date,
y = ~n,
color = ~Supplier_text,
type = "scatter",
mode = "lines")
dat_plotly_object_copy <- dat_plotly_object_copy %>%
rbind(.,dat_one_supplier)
}
identical(dat, dat_plotly_object_copy)
# The created data frame seems to be identical to what the loop does - so the order should match (?)
Using this code to set the legend...
Parts_legend <- list(
font = list(
family = "sans-serif",
size = 12,
color = "#000"),
title = list(text="<b> Delta previous month by Supplier - Absolute </b>"),
bgcolor = "#E2E2E2",
bordercolor = "#FFFFFF",
borderwidth = 2,
layout.legend = "constant",
traceorder = "grouped")
.. and showing the object:
plotly_object %>%
layout(legend = Parts_legend,
title = "by supplier delta previous month",
xaxis = list(title = 'Date'),
yaxis = list(title = 'Chip Volume'))
Leaves me with the following chart, which seems correct: Suppliers are entered by the abs(number) preceding the name! [1]: https://i.stack.imgur.com/bDTWZ.png
Now I will need to add the buttons. In the first step, I create two data frames that are supposed to indicate, if a line will later be visible (TRUE) nor not (FALSE).
I seek to create them in the same format like dat
- so that I get a TRUE or FALSE for every line of dat
/the values the filtered variable can take:
Parts_product_filter <- select(dat,Supplier_text,order,Product,Chip_type) %>%
mutate(Smartphones = ifelse(Product == "Smartphones",T,F) %>% sapply(.,list),
TVs = ifelse(Product == "TVs",T,F) %>% sapply(.,list),
Monitors = ifelse(Product == "Monitors",T,F) %>% sapply(.,list),
Miscellaneous = ifelse(Product == "Miscellaneous",T,F) %>% sapply(.,list))
Parts_chip_type_filter <- select(dat,Supplier_text,order,Product,Chip_type) %>%
mutate(Micro = ifelse(Chip_type == "Micro",T,F) %>% sapply(.,list),
Nano = ifelse(Chip_type == "Nano",T,F) %>% sapply(.,list),
BiMech = ifelse(Chip_type == "BiMech",T,F) %>% sapply(.,list),
Titan = ifelse(Chip_type == "Titan",T,F) %>% sapply(.,list),
Quantum = ifelse(Chip_type == "Quantum",T,F) %>% sapply(.,list),
Platinum = ifelse(Chip_type == "Platinum",T,F) %>% sapply(.,list),
PlainChip = ifelse(Chip_type == "PlainChip",T,F) %>% sapply(.,list),
Classic = ifelse(Chip_type == "Classic",T,F) %>% sapply(.,list))
Adding the buttons to the plotly_object, I try to set them so that they filter based on the individual columns of the "_filter" data frames created above:
plotly_object %>%
layout(legend = Parts_legend,
title = "by supplier delta previous month",
xaxis = list(title = 'Date'),
yaxis = list(title = 'Chip Volume'),
updatemenus = list(
list(
active = 0,
type = "dropdown",
y = 1.1,
direction = "right",
# See from here:
buttons = list(
list(label = "All",
method = "restyle",
args = list("visible",T)),
list(label = "Smartphones",
method = "restyle",
args = list("visible",Parts_product_filter$Smartphones)),
list(label = "TVs",
method = "restyle",
args = list("visible",Parts_product_filter$TVs)),
list(label = "Monitors",
method = "restyle",
args = list("visible",Parts_product_filter$Monitors)),
list(label = "Miscellaneous",
method = "restyle",
args = list("visible",Parts_product_filter$Miscellaneous))
)
),
list(
active = 0,
type = "dropdown",
y = 1.03,
direction = "right",
buttons = list(
list(label = "All",
method = "restyle",
args = list("visible",T)),
list(label = "Micro",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Micro)),
list(label = "Nano",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Nano)),
list(label = "BiMech",
method = "restyle",
args = list("visible",Parts_chip_type_filter$BiMech)),
list(label = "Titan",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Titan)),
list(label = "Quantum",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Quantum)),
list(label = "Platinum",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Platinum)),
list(label = "PlainChip",
method = "restyle",
args = list("visible",Parts_chip_type_filter$PlainChip)),
list(label = "Classic",
method = "restyle",
args = list("visible",Parts_chip_type_filter$Classic))
)
)
)
)
And exactly that does not work. I must be setting the filters wrong. I know because when I filter the combination of "Product = TVs" and "Chip_type = Nano", no lines appear....
https://i.stack.imgur.com/MaJ5r.png
... although there is data:
> dat %>% filter(Product == "TVs") %>% filter(Chip_type == "Nano")
# A tibble: 8 x 7
Date Supplier Supplier_text order Chip_type Product n
<chr> <chr> <chr> <int> <chr> <chr> <chr>
1 2019-11 Overall TVs 14373 | 6.0% - Overall TVs 4 Nano TVs 4643
2 2019-12 Overall TVs 14373 | 6.0% - Overall TVs 4 Nano TVs 6904
3 2019-11 J 2603 | 5.8% - J 13 Nano TVs 3
4 2019-12 J 2603 | 5.8% - J 13 Nano TVs 3
5 2019-11 M -1711 | -19.4% - M 16 Nano TVs 2
6 2019-12 M -1711 | -19.4% - M 16 Nano TVs 1
7 2019-11 O 1315 | 23.6% - O 19 Nano TVs 2
8 2019-12 O 1315 | 23.6% - O 19 Nano TVs 1
I'm really looking forward to your suggestions how to set the visibility toggle of the buttons correctly!
I know that there is two similiar posts, but focussed on multiple graphs. It may very well be my lack of skill, but I could not get my problem solved with the provided solution and would appreciate your consideration and help! Switch displayed traces via plotly dropdown menu Multiple lines/traces for each button in a Plotly drop down menu in R
Something similar, but with one filter, done in Python (not R): Plotly: How to toggle traces with a button similar to clicking them in legend?
The follow-up would be: Is it possible to select multiple categories, i. e. "Nano" and "Classic", and possibly "Smartphones" and "TVs" from the other filter, at the same time? Here is a post for Python, but no answers, unfortunately: Selecting multiple buttons at once in a plotly graph
Thank you so much in advance!
Full data set for import:
<!-- begin snippet: js hide: true -->
dat <- structure(list(Date = c("2019-11", "2019-11", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-11", "2019-11", "2019-12", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-11", "2019-11", "2019-11", "2019-11", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-12", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-11", "2019-11", "2019-11", "2019-11", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-12", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-11", "2019-11", "2019-11", "2019-11", "2019-11",
"2019-12", "2019-12", "2019-12", "2019-12", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-11", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-12", "2019-11", "2019-11", "2019-11", "2019-11",
"2019-11", "2019-12", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-11", "2019-11", "2019-12", "2019-12", "2019-11",
"2019-12", "2019-12", "2019-11", "2019-11", "2019-11", "2019-12",
"2019-12", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-11", "2019-11",
"2019-11", "2019-12", "2019-12", "2019-11", "2019-11", "2019-11",
"2019-12", "2019-12", "2019-12", "2019-11", "2019-11", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-11", "2019-11", "2019-11",
"2019-11", "2019-11", "2019-11", "2019-11", "2019-12", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-11", "2019-11", "2019-12", "2019-12", "2019-12", "2019-12",
"2019-12", "2019-11", "2019-11", "2019-11", "2019-11", "2019-12",
"2019-12", "2019-11", "2019-11", "2019-11", "2019-11", "2019-12",
"2019-12", "2019-12", "2019-12", "2019-11", "2019-11", "2019-11",
"2019-12", "2019-12", "2019-12", "2019-11", "2019-12", "2019-12",
"2019-11", "2019-11", "2019-12", "2019-12"), Supplier = c("Overall Smartphones",
"Overall Smartphones", "Overall Smartphones", "Overall Smartphones",
"Overall Smartphones", "Overall Smartphones", "Overall Smartphones",
"Overall Smartphones", "Overall Smartphones", "Overall Smartphones",
"Overall Smartphones", "Overall Smartphones", "Overall Smartphones",
"Overall Smartphones", "Overall Smartphones", "Overall Smartphones",
"Overall Monitors", "Overall Monitors", "Overall Monitors", "Overall Monitors",
"Overall Monitors", "Overall Monitors", "Overall Monitors", "Overall Monitors",
"Overall Monitors", "Overall Monitors", "Overall Monitors", "Overall Monitors",
"Overall Monitors", "Overall Monitors", "Overall Monitors", "Overall Monitors",
"A", "A", "A", "A", "A", "A", "A", "A", "Overall TVs", "Overall TVs",
"Overall TVs", "Overall TVs", "Overall TVs", "Overall TVs", "Overall TVs",
"Overall TVs", "Overall TVs", "Overall TVs", "Overall TVs", "Overall TVs",
"Overall TVs", "Overall TVs", "Overall TVs", "Overall TVs", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C",
"C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D",
"D", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "F",
"F", "F", "F", "G", "G", "G", "H", "H", "H", "H", "H", "I", "I",
"I", "I", "I", "J", "J", "J", "J", "K", "K", "K", "K", "K", "L",
"L", "L", "L", "L", "L", "M", "M", "M", "M", "M", "M", "Overall Miscellaneous",
"Overall Miscellaneous", "Overall Miscellaneous", "Overall Miscellaneous",
"Overall Miscellaneous", "Overall Miscellaneous", "Overall Miscellaneous",
"Overall Miscellaneous", "Overall Miscellaneous", "Overall Miscellaneous",
"Overall Miscellaneous", "Overall Miscellaneous", "Overall Miscellaneous",
"Overall Miscellaneous", "Overall Miscellaneous", "N", "N", "N",
"N", "N", "N", "N", "O", "O", "O", "O", "O", "O", "P", "P", "P",
"P", "P", "P", "P", "P", "C", "C", "C", "C", "C", "C", "Q", "Q",
"Q", "R", "R", "R", "S"), Supplier_text = c("94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "94757 | 17.9% - Overall Smartphones",
"94757 | 17.9% - Overall Smartphones", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-33239 | -37.8% - Overall Monitors",
"-33239 | -37.8% - Overall Monitors", "-17385 | -88.0% - A",
"-17385 | -88.0% - A", "-17385 | -88.0% - A", "-17385 | -88.0% - A",
"-17385 | -88.0% - A", "-17385 | -88.0% - A", "-17385 | -88.0% - A",
"-17385 | -88.0% - A", "14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"14373 | 6.0% - Overall TVs", "14373 | 6.0% - Overall TVs",
"-8387 | -80.6% - B", "-8387 | -80.6% - B", "-8387 | -80.6% - B",
"-8387 | -80.6% - B", "-8387 | -80.6% - B", "-8387 | -80.6% - B",
"-8387 | -80.6% - B", "-8387 | -80.6% - B", "-8387 | -80.6% - B",
"5701 | 79.2% - C", "5701 | 79.2% - C", "5701 | 79.2% - C",
"5701 | 79.2% - C", "5701 | 79.2% - C", "5701 | 79.2% - C",
"5701 | 79.2% - C", "5701 | 79.2% - C", "5701 | 79.2% - C",
"5155 | 49.2% - D", "5155 | 49.2% - D", "5155 | 49.2% - D",
"5155 | 49.2% - D", "5155 | 49.2% - D", "5155 | 49.2% - D",
"5155 | 49.2% - D", "5155 | 49.2% - D", "5155 | 49.2% - D",
"5155 | 49.2% - D", "4977 | 95.4% - E", "4977 | 95.4% - E",
"4977 | 95.4% - E", "4977 | 95.4% - E", "4977 | 95.4% - E",
"4977 | 95.4% - E", "4977 | 95.4% - E", "4977 | 95.4% - E",
"4977 | 95.4% - E", "4977 | 95.4% - E", "4977 | 95.4% - E",
"3676 |18380.0% - F", "3676 |18380.0% - F", "3676 |18380.0% - F",
"3676 |18380.0% - F", "-3132 | -99.4% - G", "-3132 | -99.4% - G",
"-3132 | -99.4% - G", "3065 | 33.6% - H", "3065 | 33.6% - H",
"3065 | 33.6% - H", "3065 | 33.6% - H", "3065 | 33.6% - H",
"-2854 | -56.1% - I", "-2854 | -56.1% - I", "-2854 | -56.1% - I",
"-2854 | -56.1% - I", "-2854 | -56.1% - I", "2603 | 5.8% - J",
"2603 | 5.8% - J", "2603 | 5.8% - J", "2603 | 5.8% - J",
"2564 | 39.4% - K", "2564 | 39.4% - K", "2564 | 39.4% - K",
"2564 | 39.4% - K", "2564 | 39.4% - K", "1843 | 334.5% - L",
"1843 | 334.5% - L", "1843 | 334.5% - L", "1843 | 334.5% - L",
"1843 | 334.5% - L", "1843 | 334.5% - L", "-1711 | -19.4% - M",
"-1711 | -19.4% - M", "-1711 | -19.4% - M", "-1711 | -19.4% - M",
"-1711 | -19.4% - M", "-1711 | -19.4% - M", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1662 | -30.0% - Overall Miscellaneous", "-1662 | -30.0% - Overall Miscellaneous",
"-1439 | -95.6% - N", "-1439 | -95.6% - N", "-1439 | -95.6% - N",
"-1439 | -95.6% - N", "-1439 | -95.6% - N", "-1439 | -95.6% - N",
"-1439 | -95.6% - N", "1315 | 23.6% - O", "1315 | 23.6% - O",
"1315 | 23.6% - O", "1315 | 23.6% - O", "1315 | 23.6% - O",
"1315 | 23.6% - O", "193 | 232.5% - P", "193 | 232.5% - P",
"193 | 232.5% - P", "193 | 232.5% - P", "193 | 232.5% - P",
"193 | 232.5% - P", "193 | 232.5% - P", "193 | 232.5% - P",
"-152 | -38.1% - C", "-152 | -38.1% - C", "-152 | -38.1% - C",
"-152 | -38.1% - C", "-152 | -38.1% - C", "-152 | -38.1% - C",
"-98 | -79.7% - Q", "-98 | -79.7% - Q", "-98 | -79.7% - Q",
"92 | 3066.7% - R", "92 | 3066.7% - R", "92 | 3066.7% - R", "-70 | -90.9% - S"
), order = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 11L, 11L, 11L,
11L, 11L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 14L, 14L,
14L, 14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L,
16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L,
17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 19L, 19L,
19L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 21L,
21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 23L, 23L, 23L, 24L),
Chip_type = c("Micro", "Nano", "BiMech", "Titan", "Quantum",
"Platinum", "PlainChip", "Classic", "Micro", "Nano", "BiMech",
"Titan", "Quantum", "Platinum", "PlainChip", "Classic", "Micro",
"Nano", "BiMech", "Titan", "Quantum", "Platinum", "PlainChip",
"Classic", "Micro", "Nano", "BiMech", "Titan", "Quantum",
"Platinum", "PlainChip", "Classic", "Titan", "Platinum",
"Quantum", "Nano", "Titan", "Platinum", "Nano", "PlainChip",
"Micro", "Nano", "BiMech", "Titan", "Quantum", "Platinum",
"PlainChip", "Classic", "Micro", "Nano", "BiMech", "Titan",
"Quantum", "Platinum", "PlainChip", "Classic", "Titan", "Platinum",
"Quantum", "Nano", "Titan", "Nano", "Quantum", "Platinum",
"PlainChip", "PlainChip", "Platinum", "Nano", "Quantum",
"Classic", "PlainChip", "Platinum", "Nano", "Quantum", "PlainChip",
"Platinum", "Quantum", "Nano", "Classic", "PlainChip", "Nano",
"Platinum", "Quantum", "Classic", "PlainChip", "Quantum",
"Platinum", "Classic", "Nano", "PlainChip", "Quantum", "Platinum",
"Nano", "Classic", "BiMech", "Titan", "Nano", "Titan", "Quantum",
"Titan", "Titan", "Platinum", "PlainChip", "Nano", "Classic",
"PlainChip", "Nano", "PlainChip", "PlainChip", "Quantum",
"Nano", "Classic", "Titan", "Nano", "Titan", "Nano", "Platinum",
"PlainChip", "Quantum", "Platinum", "PlainChip", "Titan",
"PlainChip", "Platinum", "Titan", "PlainChip", "Platinum",
"Titan", "Nano", "Titan", "Platinum", "Nano", "PlainChip",
"Nano", "BiMech", "Titan", "Quantum", "Platinum", "PlainChip",
"Classic", "Micro", "Nano", "BiMech", "Titan", "Quantum",
"Platinum", "PlainChip", "Classic", "Titan", "Quantum", "Titan",
"Nano", "Quantum", "Platinum", "PlainChip", "Titan", "Quantum",
"Nano", "Micro", "Titan", "Nano", "Platinum", "Quantum",
"Nano", "Classic", "Quantum", "Platinum", "Nano", "Classic",
"Classic", "Quantum", "Nano", "Classic", "Quantum", "Nano",
"Quantum", "Quantum", "Nano", "Quantum", "Nano", "Quantum",
"Titan"), Product = c("Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "TVs", "TVs", "TVs", "TVs", "TVs", "TVs",
"TVs", "TVs", "TVs", "TVs", "TVs", "TVs", "TVs", "TVs", "TVs",
"TVs", "Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "TVs", "TVs", "TVs",
"TVs", "Smartphones", "Smartphones", "Smartphones", "Smartphones",
"Smartphones", "TVs", "TVs", "TVs", "TVs", "TVs", "TVs",
"TVs", "TVs", "TVs", "TVs", "TVs", "TVs", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Monitors", "Monitors",
"Monitors", "Monitors", "Monitors", "Monitors", "Monitors",
"TVs", "TVs", "TVs", "TVs", "TVs", "TVs", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous",
"Miscellaneous", "Miscellaneous", "Miscellaneous", "Miscellaneous"
), n = c("106", "16920", "61216", "363698", "50797", "52715",
"174342", "9319", "92", "16928", "40920", "270963", "48605",
"34068", "114333", "4024", "3", "1536", "6793", "45146",
"7922", "5359", "27390", "1131", "12", "1311", "5431", "48107",
"6230", "5133", "21161", "505", "3619", "13", "2", "1", "19720",
"13", "10", "4", "96", "4643", "14534", "166664", "17178",
"17489", "30048", "5010", "96", "6904", "10463", "158060",
"15864", "20149", "24173", "2390", "12102", "7", "2", "1",
"10390", "5", "4", "2", "1", "11036", "329", "224", "2",
"2", "6936", "176", "85", "1", "15335", "55", "53", "48",
"14", "10292", "86", "47", "32", "11", "6559", "667", "631",
"419", "416", "4416", "336", "285", "105", "74", "2", "18",
"2", "18", "2", "86", "3151", "1", "14682", "77", "10", "9098",
"26", "2833", "5083", "2", "1", "1", "41051", "3", "45233",
"3", "10763", "44", "2", "6508", "2", "370", "265", "6",
"461", "86", "4", "5996", "2", "8826", "2", "1", "1", "503",
"5", "79", "3348", "742", "199", "989", "1", "473", "11",
"152", "3681", "363", "54", "804", "1702", "1", "1500", "2",
"1", "1", "1", "4868", "5", "2", "1", "5573", "1", "312",
"113", "3", "3", "42", "30", "6", "5", "371", "53", "19",
"312", "64", "23", "97", "121", "2", "3", "1", "3", "77")), row.names = c(NA,
-182L), class = c("tbl_df", "tbl", "data.frame"))
#[1]: https://i.stack.imgur.com/bDTWZ.png #[2]: https://i.stack.imgur.com/MaJ5r.png