Site icon Towards AI

Tips and tricks for Plotly Bar Chart

Author(s): Kashish Rastogi

Data Visualization

Step-by-step guide for Bar Chart and making mind-blowing visualization. Tips and tricks to make your work easy.

Image by: https://www.linkedin.com/in/kashish-rastogi-3a8b4119a

You never knew you needed Plotly! Plotly is like chocolate for visualization you can’t get enough of it. The best library has the best user interaction charts.

Here I am going to talk about different types of Bar charts in Plotly. Data is taken from Kaggle and the whole notebook is available here.

The idea behind making a chart.

How you display data has more power than any charts you use, but the right chart also matters a lot.

Let’s get started!

Data

The idea to make a chart was to display which program; TV Shows or Movies has the highest rating on Netflix.

Data for making chart

First Plot

Plotted a stacked bar chart for comparison between TV Shows and Movies. This chart tells us that Netflix’s audience prefers to watch movies rather than TV Shows. The Highest rating is given to Movies and TV Show having TV-MA tag which tell us that most of the content on Netflix is for the mature audience and not for age 17 years and under.

Code:

fig = px.histogram(df, y='rating', color='type')
Stacked Bar chart — Plotly

I am quite satisfied with the Stacked bar chart but it is not easy to look for TV shows in the chart. Sometimes the amount of TV Shows is so little that even if the TV Show value is present in the chart at my first glance of the chart I am not being able to see it.

Don’t worry we have another option too.

Group Bar chart

code:

fig = px.histogram(df, y='rating', color='type', barmode='group')
Group Bar chart — Plotly

Now I can clearly see and compare the TV Shows and Movies for Ratings. It looks quite elegant now but in TV Show ‘R’ rating have a very small value and, ‘PG-13’, ‘PG’, etc do not have any value. The audience might don’t see this information as its value is very less. Do you think any other chart is more suitable than this? Let’s find out.

Bidirectional Bar chart

Bidirectional Bar Chart — Plotly

This is the best chart till now it is easy to compare both TV Show and Movies vs Rating.

Code:

# making a copy of df
dff = df.copy()
#1. making a df one for tv show with rating
df_tv_show = dff[dff['type']=='TV Show'][['rating', 'type']].rename(columns={'type':'tv_show'})
# making a df for movie with rating
df_movie = dff[dff['type']=='Movie'][['rating', 'type']].rename(columns={'type':'movie'})

Making a data frame for each TV Show and Movie with Ratings.

Selecting the data which has Type= TV Show with a rating and renaming the column to ‘tv_show’. The df_tv_show look like this

Data Frame of df_tv_show

Selecting the data which has Type= Movie with a rating and renaming the column to ‘movie’. The df_movie look like this

Data Frame of df_movie

Now let’s find out the value counts of rating in df_tv_show and df_movie.

# 2.
df_tv_show = df_tv_show.rating.value_counts()
df_tv_show = pd.DataFrame(df_tv_show).reset_index().rename(columns={'index':'tv_show'})
df_tv_show['rating_final'] = df_tv_show['rating']
# making rating column value negative
df_tv_show['rating'] *= -1
df_movie = df_movie.rating.value_counts()
df_movie = pd.DataFrame(df_movie).reset_index().rename(columns={'index':'movie'})

After finding out the value count of the rating rename the columns to tv_show. We want to build a Bidirectional Bar chart so one of the ‘type’ has to set the values of rating on the negative x-axis. Let’s make a new column rating_final where multiply (-1) with the original values of rating.

The data look like this for df_tv_show.

After finding out the value count of the rating rename the columns to the movie. The data look like this for df_movie.

All the preprocessing is done.

Let’s make the Bidirectional Bar Chart

Code:

fig = make_subplots(rows=1, cols=2, specs=[[{}, {}]], shared_yaxes=True, horizontal_spacing=0)
# bar plot for tv shows
fig.append_trace(go.Bar(x=df_tv_show.rating, y=df_tv_show.tv_show,
orientation='h', showlegend=True,
text=df_tv_show.rating_final,
name='TV Show',
marker_color='#221f1f'), 1, 1)
# bar plot for movies
fig.append_trace(go.Bar(x=df_movie.rating, y=df_movie.movie,
orientation='h', showlegend=True,
text=df_movie.rating,
name='Movie', marker_color='#b20710'), 1, 2)

Making 2 subplots of bar chart one bar chart having df_tv_show and another one with df_movie.

Parameters:

For further details in the parameters give a look at this blog.

These are the additional parameters to look the bar chart more attractive.

fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False, categoryorder='total ascending',
ticksuffix=' ', showline=False)
fig.update_traces(hovertemplate=None)
fig.update_layout(title='Which has the highest rating TV shows or Movies?',
margin=dict(t=80, b=0, l=70, r=40),
hovermode="y unified",
xaxis_title=' ', yaxis_title=" ",
plot_bgcolor='#333', paper_bgcolor='#333',
title_font=dict(size=25, color='#8a8d93',
family="Lato, sans-serif"),
font=dict(color='#8a8d93'),
legend=dict(orientation="h", yanchor="bottom",
y=1, xanchor="center", x=0.5),
hoverlabel=dict(bgcolor="black", font_size=13,
font_family="Lato, sans-serif"))
fig.add_annotation(dict(x=0.81, y=0.6, ax=0, ay=0,
xref = "paper", yref = "paper",
text= "<b>97%</b> people prefer Movies over TV Shows on Netflix.<br> Large number of people watch TV-MA rating <br> Movies which are for mature audience."
))
fig.add_annotation(dict(x=0.2, y=0.2, ax=0, ay=0,
xref = "paper", yref = "paper",
text= "<b>3%</b> people prefer TV Shows on Netflix.<br> There is no inappropriate content for<br> ages 17 and under in TV Shows."
))
# bar plot for movies
fig.append_trace(go.Bar(x=df_movie.rating, y=df_movie.movie, orientation='h', showlegend=True, text=df_movie.rating,
name='Movie', marker_color='#b20710'), 1, 2)
fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False, categoryorder='total ascending', ticksuffix=' ', showline=False)
fig.update_traces(hovertemplate=None)
fig.update_layout(title='Which has the highest rating TV shows or Movies?',
margin=dict(t=80, b=0, l=70, r=40),
hovermode="y unified",
xaxis_title=' ', yaxis_title=" ",
plot_bgcolor='#333', paper_bgcolor='#333',
title_font=dict(size=25, color='#8a8d93', family="Lato, sans-serif"),
font=dict(color='#8a8d93'),
legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="center", x=0.5),
hoverlabel=dict(bgcolor="black", font_size=13, font_family="Lato, sans-serif"))
fig.add_annotation(dict(x=0.81, y=0.6, ax=0, ay=0,
xref = "paper", yref = "paper",
text= "<b>97%</b> people prefer Movies over TV Shows on Netflix.<br> Large number of people watch TV-MA rating <br> Movies which are for mature audience."
))
fig.add_annotation(dict(x=0.2, y=0.2, ax=0, ay=0,
xref = "paper", yref = "paper",
text= "<b>3%</b> people prefer TV Shows on Netflix.<br> There is no inappropriate content for<br> ages 17 and under in TV Shows."
))

Steps to make this chart:

Changing the color of bars in the chart.

Setting the background color of the chart.

Giving appropriate Title to the chart.

Adding text to the bar

Adding an annotation to charts

Setting different colors for text on the bar, Title, and annotation.

If you find this article useful do like it.

Other Resources:

Bar racing charts with Plotly


Tips and tricks for Plotly Bar Chart was originally published in Towards AI on Medium, where people are continuing the conversation by highlighting and responding to this story.

Published via Towards AI

Exit mobile version