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:
The key points that we can see from our dataframe are:-
- The available data is only for India.
- Every day data is available.
- 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:-
- Giving the figure size as (15,5) inches and keeping dpi (dots per inches) equal to 300
- Plotting bar graph for daily confirmed cases.
- Plotting line graph for 7 days rolling average of recovered and confirmed cases
- Printing level of last available date
- Showing the data for each day but sowing xticks in 7 days gap( to clearly visualize xticks )
Another key points are:
- For color of bars and line graph we can either put color name or its hex number
There are different types of plotting styles available that we can use:-
- fivethirtyeight
- classic
- seaborn-pastel
- seaborn-whitegrid
- ggplot
- grayscale
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 -
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 -
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-
You can check full code in Github
Thanks for reading and please share your feedback.