Tips and tricks for Plotly Bar Chart
Last Updated on August 6, 2021 by Editorial Team
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.
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.
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')
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')
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
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
Selecting the data which has Type= Movie with a rating and renaming the column to βmovieβ. The df_movie look likeΒ this
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:
- shared_yaxis= True: To make a bidirectional bar chart; the bar chart needs to share theΒ y-axis
- horizontal_spacing=0: Space between both the bar charts should be 0. If you want space between the 2 bar charts then specify the value in this parameter.
- orientation: We can see the bar chart in two forms one is horizontal and another one is theΒ vertical
- text: The value which we are seeing on the bar is being displayed with βtextβ parameter.
- name: It will specify the name of the legends (Movie, TVΒ Show)
- marker_color: You can specify any color you want for theΒ bars.
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.
- Choosing appropriate colors like red and black which are in the Netflix logo. You can choose any color you want but choose contrast color when you have charts that need a comparison like the aboveΒ chart.
Setting the background color of theΒ chart.
- Setting the background and bar color should be always different like in this case the bar color for a TV Show is a darker shade of black and the background is a lighter shade of black. We can easily differentiate both the bar and background.
Giving appropriate Title to theΒ chart.
- Most of the time people use a title that is very basic like βType vs Ratingβ this title is not wrong but having a Title that automatically tells you about the chart is a very crucialΒ step.
- The title which we use here is βWhich has the highest Rating TV Shows or Movies on Netflix?β This title automatically tells us that the below chart will be a comparison between TV Show and Movie for Ratings and additionally it also states that the data which we are looking for is fromΒ Netflix.
Adding text to theΒ bar
- When should you add text to the bar it depends on the useΒ case.
- Letβs take an example like here in the above chart when we compare the TV shows and Movies with Ratings. In TV Show βRβ rating does have 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 thatβs why it is important to set the text on theΒ bars.
- Additionally, it is easy to compare side-by-side bars for TV shows and Movies VsΒ Ratings.
Adding an annotation toΒ charts
- Here I have given information like 97% of the audience prefer Movies over TV Show. Laying out more information related to charts is the best way you can present theΒ chart.
Setting different colors for text on the bar, Title, and annotation.
- You should always follow thisΒ Rule:
- Title: Font for the title should be alwaysΒ bigger
- Text on Bar: Text on the bar should be always smaller than the main title of theΒ chart.
- By using this rule the charts you make will look good, So always follow this rule of title, annotation, and text on theΒ bar.
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