Covid19 Data Visualization using Matplotlib

Covid19 Data Visualization using Matplotlib

In this blog we will analyse covid-19 data of India Region using Matplotlib (Matplotlib is a plotting library for the Python programming language).

First we will import all the necessary libraries

import pandas as pd
import matplotlib.pyplot as plt
import urllib.request, json

DataSet:

We are extracting the data from the Covid19 API which is in JSON format. We will use urllib.request & json library to extract and load the data. The data updates on a daily basis and available till a day before.

Import Data:

# Importing covid 19 latest available data
with urllib.request.urlopen("https://api.covid19api.com/total/country/india") as url:
    data = json.loads(url.read().decode())

# converting the data into Dataframe
covid_india_data=pd.DataFrame(data)

Now to show the data we can run:

#It will show last 5 rows of the dataframe
covid_india_data.tail()

It will show the output as:

image.png

The key points that we can see from our dataframe are:-

  1. The available data is only for India.
  2. Every day data is available.
  3. Confirmed, Deaths and Recovered data are available as cumulative sum i.e. everyday we are getting total number of Confirmed, Deaths and Recovered cases till date.

In order to get the data for each day(not cumulative data) we need to subtract each row from its above row.

# Creating calculated columns for 'Confirmed','Death','Recovered' cases
covid_india_data["Calculate_Confirmed"]=covid_india_data["Confirmed"].diff()
covid_india_data["Calculate_Death"]=covid_india_data["Deaths"].diff()
covid_india_data["Calculate_Recovered"]=covid_india_data["Recovered"].diff()

We only want "yyyy-mm-dd" format data from our date column.

# split Date column
covid_india_data["Date"]=covid_india_data["Date"].str.split("T",expand=True)[0]

Now we will use matplotlib to plot trend of covid19 data. Steps that we are performing are:-

  1. Giving the figure size as (15,5) inches and keeping dpi (dots per inches) equal to 300
  2. Plotting bar graph for daily confirmed cases.
  3. Plotting line graph for 7 days rolling average of recovered and confirmed cases
  4. Printing level of last available date
  5. Showing the data for each day but sowing xticks in 7 days gap( to clearly visualize xticks )

Another key points are:

  1. For color of bars and line graph we can either put color name or its hex number
  2. There are different types of plotting styles available that we can use:-

    1. fivethirtyeight
    2. classic
    3. seaborn-pastel
    4. seaborn-whitegrid
    5. ggplot
    6. grayscale
    7. default

      To use any of the above style we need to run plt.style.use('plot_style_name')

      example :- plt.style.use('fivethirtyeight')

Plotting Covid-19 Trend of Confirmed & Recovered Cases:

# figuresize
plt.figure(figsize=(15,5),dpi=300)

# bar graph for confirmed cases
plt.bar(covid_india_data["Date"],covid_india_data["Calculate_Confirmed"],color='#abcdef',label="Confiermed Cases")

# line graph for 7 Days Rolling Recovered & Confirmed Cases Cases
plt.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Recovered"][:-1],color='#039129',label="7 Days Rolling Recovered Cases")
plt.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Confirmed"][:-1],color='#031b91',label="7 Days Rolling Confirmed Cases")

# title, xlabel and ylabel
plt.title("Covid-19 Trend of Confirmed & Recovered Cases",fontsize=20)
plt.xlabel("Date",fontsize=12)
plt.ylabel("Number of Cases",fontsize=12)

# grid and legend
plt.grid()
plt.legend()

# plotting level for latest available day
plt.text(covid_india_data["Date"].iloc[-1],covid_india_data["Calculate_Confirmed"].iloc[-1], int(covid_india_data["Calculate_Confirmed"].iloc[-1]))
plt.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Recovered"].iloc[-1],int(covid_india_data["Rolling_Recovered"].iloc[-1]))
plt.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Confirmed"].iloc[-1],int(covid_india_data["Rolling_Confirmed"].iloc[-1]))

# xtickes in gap of 7
plt.xticks(covid_india_data["Date"][::7])
# rotating xticks
plt.xticks(rotation=70)

# saving figure
plt.savefig("Covid Trend.jpg",dpi=300)

#show
plt.show()

output -

image.png

Plotting Covid-19 Trend of Death Cases:

# figuresize
plt.figure(figsize=(15,5),dpi=300)

# bar graph for death cases
plt.bar(covid_india_data["Date"],covid_india_data["Calculate_Death"],color='#f58762',label="Death Cases")
# line graph for 7 Days Rolling Death Cases
plt.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Death"][:-1],color='Red',label="7 Days Rolling Death Cases")

# title, xlabel and ylabel
plt.title("Covid-19 Trend of Death Cases",fontsize=20)
plt.xlabel("Date",fontsize=12)
plt.ylabel("Number of Death Cases",fontsize=12)

# grid and legend
plt.grid()
plt.legend()

# plotting level for latest available day
plt.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Death"].iloc[-1], int(covid_india_data["Rolling_Death"].iloc[-1]))
plt.text(covid_india_data["Date"].iloc[-1],covid_india_data["Calculate_Death"].iloc[-1],int(covid_india_data["Calculate_Death"].iloc[-1]))

# xtickes in gap of 7
plt.xticks(covid_india_data["Date"][::7])
# rotating xticks
plt.xticks(rotation=70)

# saving figure
plt.savefig("Covid Death Trend.jpg",dpi=300)

#show
plt.show()

output -

image.png

Now we will plot both the above graphs in a single frame using subplot and also we will print total number of confirmed, recovered and death cases till date.

# figuresize
fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(15, 5))

# bar graph for confirmed cases
ax1.bar(covid_india_data["Date"],covid_india_data["Calculate_Confirmed"],color='#abcdef',label="Confiermed Cases")

# line graph for 7 Days Rolling Recovered & Confirmed Cases Cases
ax1.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Recovered"][:-1],color='#039129',label="7 Days Rolling Recovered Cases")
ax1.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Confirmed"][:-1],color='#031b91',label="7 Days Rolling Confirmed Cases")

# title
ax1.set_title("Corona Trend",fontsize=20)

# grid, legend and ylabel
ax1.grid()
ax1.legend()
ax1.set_ylabel("Number of Cases",fontsize=12)

# plotting level for latest available day
ax1.text(covid_india_data["Date"].iloc[-1],covid_india_data["Calculate_Confirmed"].iloc[-1], int(covid_india_data["Calculate_Confirmed"].iloc[-1]))
ax1.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Recovered"].iloc[-1],int(covid_india_data["Rolling_Recovered"].iloc[-1]))
ax1.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Confirmed"].iloc[-1],int(covid_india_data["Rolling_Confirmed"].iloc[-1]))

######################################## second plot ########################################

# bar graph for death cases
ax2.bar(covid_india_data["Date"],covid_india_data["Calculate_Death"],color='#f58762',label="Death Cases")

# line graph for 7 Days Rolling Recovered & Confirmed Cases Cases
ax2.plot(covid_india_data["Date"][:-1],covid_india_data["Rolling_Death"][:-1],color='Red',label="7 Days Rolling Death Cases")

# title
ax2.set_title("Corona Death Trend",fontsize=20)

# grid, legend and ylabel
ax2.grid()
ax2.legend()
ax2.set_ylabel("Number of Cases",fontsize=12)

# plotting level for latest available day
ax2.text(covid_india_data["Date"].iloc[-1],covid_india_data["Rolling_Death"].iloc[-1], int(covid_india_data["Rolling_Death"].iloc[-1]))
ax2.text(covid_india_data["Date"].iloc[-1],covid_india_data["Calculate_Death"].iloc[-1],int(covid_india_data["Calculate_Death"].iloc[-1]))

# xtickes in gap of 7
ax2.set_xticks(covid_india_data["Date"][::7])
# rotating xticks
ax2.set_xticklabels(covid_india_data["Date"][::7],rotation=70)

# xlabel
plt.xlabel("Date",fontsize=12)

# saving figure
plt.savefig("Covid Combine Trends.jpg",dpi=300)

# show
plt.show()

# printing total confirmed, recovered and death cases
print('\033[1m','\033[96m',"Total number of confirm cases till date in India ->",covid_india_data["Confirmed"].iloc[-1])
print('\033[92m'," Total number of recovered cases till date in India ->",covid_india_data["Recovered"].iloc[-1])
print('\033[91m'," Total number of death till date in India ->",covid_india_data["Deaths"].iloc[-1])

output-

image.png

You can check full code in Github

Thanks for reading and please share your feedback.