Albert Rapp Profile picture
Dec 14, 2022 16 tweets 8 min read Read on X
Analytics dashboards are a popular way to explore data or to communicate insights.

So it's good to know how to build one.

Here's how you do that with R in no time. 🧵 #rstats #shiny ImageImage
1 // Data

First, you need data.

It's always fun to work with your personal data, so I will use my the last three months of my Twitter analytics data. You can download yours at analytics.twitter.com

You could also download the public metrics with {rtweet} instead. Image
2 // Data cleaning

Next, do a bit of data cleaning. In my case, I just have to clean the column names and select a few columns.

{janitor} and {dplyr} make that easy. Image
3 // Set up dashboard

Now, we can already start building the dashboard.

Use {shiny} and {bs4Dash} to set up the dashboard. The UI elements from {bs4Dash} make that really simple Image
3b // UI elements from {bs4Dash}

Basically what you need are the modular dashboardXYZ() functions and bs4Cards(). ImageImage
4 // Fill sidebars

Now you can include your data in your app.
Use it to fill the sidebars with sliders.

The easiest way is to write a wrapper around the sliderInput() and use it to fill the sidebar. ImageImage
5 // Add table

The sliders will be used to filter our data. Once it is filtered, we can put it into a table with {reactable}.

This is a 3-step process:

1️⃣ Add reactableOutput() to the UI
2️⃣ Create a reactive for the filtered data
3️⃣ Render table with renderReactable() ImageImage
5b // Table formatting

The table columns could use some formatting. You can do that within the reactable() function.

If you're not familiar with {reactable}, you can just follow along the *many* examples in the excellent docs at glin.github.io/reactable/arti…
6 // Add a box

Adding boxes works on both the UI and the server side.

In the UI, use bs4ValueBoxOutput().

In the server, do two things:
1️⃣ Compute metric summary
2️⃣ Render Value box ImageImage
6b // Repeat for more boxes

You can repeat the same procedure to include more boxes.

The best way to do that is with modules. Since they are best explained in a separate example, I'll just leave this here:
7 // Add interactive plots

Finally, we can add interactive plots with {plotly} using plotlyOutput() + renderPlotly().

And the best part: You don't need to know how {plotly} works. Just make a ggplot and convert it with ggplotly(). ImageImage
7b // Repeat for more plots

Once again, you can repeat the same logic to include more plots with or without modules. The choice is yours.
8 // Reactivity to dark theme

Finally, we need to make sure that the table and the plots react to the dashboard's dark theme toggle.

For the plot, load {thematic} and activate it with thematic_shiny().
For the table, follow the instructions from the docs glin.github.io/reactable/arti…
Yay! 🥳 We've successfully built an analytics dashboard.

Need more details? You can check out the micro-course I've set up for this project.

It comes with code for the completed app and a full video walk-through. You can get it at courses.albert-rapp.de/l/shiny-analyt…
That's a wrap! 🙌

I hope you've found this thread helpful. If you want to see more content like this, follow @rappa753 for more. ☺️

Also, don't forget to Like/Retweet the first tweet below if you can.

See you next time! 👋
If you liked this post, you may enjoy my 3-minute newsletter too.

Every week, my newsletter shares insights on
- dataviz,
- Shiny web apps
- stats

Reading time: 3 minutes or less

You can join at
alberts-newsletter.beehiiv.com/subscribe

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Albert Rapp

Albert Rapp Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @rappa753

Sep 9, 2023
Three steps to use color in your title instead of wasting space on a huge legend. Image
1 // Wrap your subtitle into <span> tags

These span-tags are HTML notation for inline text. So in principle, adding them should change nothing.

But as you can see, it does have an impact.
Image
Image
2 // Enable HTML notation

The problem is that ggplot does not know that you want to use HTML notation.

So, enable that with element_markdown() from the {ggtext} package in theme.

This will render the span-tags instead of displaying them as text:
Image
Image
Read 7 tweets
Aug 26, 2023
Paired bar charts suck at comparing values. The only reason they're used all the time is because they are easy to create.

But there are better alternatives that are just as easy.

Here's how to create 4 better alternatives with #rstats. Image
0 // Where's the code?

The code for all plots can be found at

This thread walks you through the code quickly.albert-rapp.de/posts/ggplot2-…
1 // Dot plot

Instead of using bars next to each other, why not points on the same line?

Makes comparison suuper easy.

And it takes only a geom_point() layer. Dead-simple, right?

I think it's even easier to create than a paired bar chart.
Image
Image
Read 15 tweets
Aug 19, 2023
R makes it dead-simple to use some of the most effective dataviz principles.

Here are six principles that are so easy that any ggplot beginner’s course should teach them.
1 // Make sure your labels are legible

Too many plots use waaaay too small texts.
With ggplot, it just takes one line to fix this.

Img 1: Way too small fonts & unclear labels
Img 2: Fixed with labs() and theme_gray(base_size = 20)
Img 3: Full code

Image
Image
Image
2 // Use a minimal theme

As a rule of thumb, you should minimize everything that could potentially distract your audience.

That’s why I usually recommend to use a minimal theme: Just use `theme_minimal()` instead of `theme_gray()`. Image
Read 9 tweets
Jun 17, 2023
Need to extract days, months, years or more from time data?

Don't compute them all manually with {lubridate}. That's way too tedious.

The {timetk} package has a nice function that does all the heavy lifting for you.

LEFT: {lubridate} workflow
RIGHT: {timetk} workflow
#rstats ImageImage
BONUS: Maybe you don't want use all of the stuff that {timetk} computes for you.

Here's a simple function that extracts only the parts you want.

All of the code can be found on GitHub at gist.github.com/AlbertRapp/2c9… Image
Also, shoutout to @EatsleepfitJeff for teaching me about this function from {timetk} ☺️
Read 4 tweets
Jun 10, 2023
Everybody loves colors but only few know how to use them well.

With the right guidelines, using colors becomes super easy.

Let me show you how to implement these guidelines with ggplot 🧵
#rstats
Anyone can create a stacked bar chart with ggplot.

But that can end up in a colorful & messy plot.

Let's implement a couple of guidelines from this datawrapper blog post to level up our color game blog.datawrapper.de/10-ways-to-use… Image
The key is to reduce the amount of colors and leverage the `alpha` aesthetic as well. Image
Read 11 tweets
Jun 7, 2023
Sometimes people ask me if I can do one-on-one R tutoring.

Sure I can. But then my hourly rate applies. And there are many amazing *free* resources. Want to try them first?

Here are a few that I recommend. #rstats
1 // Yet Again: R + Data Science

Find it at yards.albert-rapp.de

I'll start with one of my own bc I assume that you like my style (otherwise why ask me?)

Beware though: YARDS is a graduate-level course that I taught for math students w/ a bit of programming experience. Image
2 // R for Data Science

To me this book is like the R bible. It introduced me to the so-called tidyverse and taught me much of what I know.

This one starts out slow and is really beginner-friendly

r4ds.had.co.nz
Read 11 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(