What are the most popular couch fabrics? Visualizing product matrix with R
Pufetto — a Ukrainian furniture brand — has an online customization tool where you can build your dream couch changing its size and fabric. But what fabrics are the most attractive? I picked a bunch of popular couches and looked at which fabrics people clicked the most. Below I show how to visualize it with R.
Building a product heatmap
The idea was to build a heatmap showing most clickable fabrics by couches. To make the plot less messy, I included only fabrics that received a minimum required number of clicks. Here is what I got

Looks interesting, but not readable, and definitely not actionable. I decided to improve the following:
- Limit number of fabrics to top 5 per couch
- Use relative ranking instead of absolute number of clicks to make fabrics differentiate across couches
- Sort fabrics and couches by popularity
- Add meaningful axis labels
Here is the final iteration

Looks much better!
Here is the R code behind it:
# fabric_clicks is a DF of couch names, fabrics, and dates
fabric_clicks %>%
filter(date >= ymd('2019-01-01')) %>%
count(couch_name, fabric) %>%
group_by(couch_name) %>%
mutate(rank = rank(desc(n)), total_couch_clicks = sum(n)) %>%
filter(rank <= 5) %>% arrange(couch_name, rank) %>%
group_by(fabric) %>%
mutate(avg_fabric_rank = mean(rank)) %>%
ggplot(aes(fct_reorder(couch_name, desc(total_couch_clicks)), fct_reorder(fabric, desc(avg_fabric_rank)), fill = rank)) +
geom_tile() +
geom_text(aes(label = ifelse(is.na(rank), '', rank)), color = 'white') +
scale_fill_continuous(guide=guide_colourbar(reverse = T), low="#5EB7F8", high="#1A334B") +
labs(title = 'Top 5 clickable fabrics by couches', subtitle = '2019`s average',
fill = 'rank', x = 'couch\n ← more popular less popular →', y = 'fabric by avg rank') +
theme(axis.text.x = element_text(angle = -45))
Conclusion
It supposed to be a solely technical R-devoted post, so don’t expect result interpretation here (although it seems pretty straightforward — all bestclicking fabrics are both the cheapest and the most visible ones). Remember, that often (1) less is more and (2) order matters.