在Python中使用 matplotlib 进行 COVID-19 数据可视化
想象病毒是如何从一个零号病人传播到今天的四百万人的,感觉超现实。这是可能的,因为交通系统。在过去的早些时候,我们没有今天的交通系统的一小部分。
好吧,您现在可以遵循的良好做法是对您的杂货产品进行消毒并让它们闲置一两天。在我们找到可能距离我们数年之久的疫苗之前,在公共场所保持社交距离是减少病例数量的唯一方法。确保以额外片剂或食物形式服用维生素 C。好吧,它不会阻止你感染电晕,但至少如果你被感染了,你的免疫力会比没有用它来对抗病毒的人更强。最后一种做法是用 Namaste 或 Wakanda Salute 代替握手。
入门
我们将介绍 matplotlib 中可用的一些基本绘图,并使其更美观。
这是我们将使用 matplotlib 设计的可视化
- 简单的情节?—?日期处理
- 饼形图
- 条形图
链接到数据集 (CSV):单击此处
初始化数据集
在 Covid-19 India 案例时间序列上导入数据集
data = pd.read_csv('case_time_series.csv')
case_time_series.csv 数据集有 7 列。我们将在变量中收集 Daily Confirmed Daily Recovered 和 Daily Deaded 作为数组。
Y = data.iloc[61:,1].values #Stores Daily Confirmed
R = data.iloc[61:,3].values #Stores Daily Recovered
D = data.iloc[61:,5].values #Stores Daily Deceased
X = data.iloc[61:,0] #Stores Date
“ Y”变量存储“每日确诊”冠状病毒病例
“ R”变量存储“每日恢复的”冠状病毒病例
“D ”变量存储“每日死亡”冠状病毒病例
而“X”变量存储“日期”列
绘制简单图
我们将遵循面向对象的绘图方法。 plot函数采用两个参数,即 X 轴值和 Y 轴值绘图。在这种情况下,我们将传递具有“日期”的“X”变量和具有“每日确认”的“Y”变量来绘制。
例子:
Python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('case_time_series.csv')
Y = data.iloc[61:,1].values
R = data.iloc[61:,3].values
D = data.iloc[61:,5].values
X = data.iloc[61:,0]
plt.plot(X,Y)
Python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('case_time_series.csv')
Y = data.iloc[61:,1].values
R = data.iloc[61:,3].values
D = data.iloc[61:,5].values
X = data.iloc[61:,0]
plt.figure(figsize=(25,8))
ax = plt.axes()
ax.grid(linewidth=0.4, color='#8f8f8f')
ax.set_facecolor("black")
ax.set_xlabel('\nDate',size=25,color='#4bb4f2')
ax.set_ylabel('Number of Confirmed Cases\n',
size=25,color='#4bb4f2')
ax.plot(X,Y,
color='#1F77B4',
marker='o',
linewidth=4,
markersize=15,
markeredgecolor='#035E9B')
Python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('case_time_series.csv')
Y = data.iloc[61:,1].values
R = data.iloc[61:,3].values
D = data.iloc[61:,5].values
X = data.iloc[61:,0]
plt.figure(figsize=(25,8))
ax = plt.axes()
ax.grid(linewidth=0.4, color='#8f8f8f')
ax.set_facecolor("black")
ax.set_xlabel('\nDate',size=25,color='#4bb4f2')
ax.set_ylabel('Number of Confirmed Cases\n',
size=25,color='#4bb4f2')
plt.xticks(rotation='vertical',size='20',color='white')
plt.yticks(size=20,color='white')
plt.tick_params(size=20,color='white')
for i,j in zip(X,Y):
ax.annotate(str(j),xy=(i,j+100),color='white',size='13')
ax.annotate('Second Lockdown 15th April',
xy=(15.2, 860),
xytext=(19.9,500),
color='white',
size='25',
arrowprops=dict(color='white',
linewidth=0.025))
plt.title("COVID-19 IN : Daily Confirmed\n",
size=50,color='#28a9ff')
ax.plot(X,Y,
color='#1F77B4',
marker='o',
linewidth=4,
markersize=15,
markeredgecolor='#035E9B')
Python3
slices = [62, 142, 195]
activities = ['Travel', 'Place Visit', 'Unknown']
cols=['#4C8BE2','#00e061','#fe073a']
exp = [0.2,0.02,0.02]
plt.pie(slices,labels=activities,
textprops=dict(size=25,color='black'),
radius=3,
colors=cols,
autopct='%2.2f%%',
explode=exp,
shadow=True,
startangle=90)
plt.title('Transmission\n\n\n\n',color='#4fb4f2',size=40)
Python3
data = pd.read_csv('district.csv')
data.head()
re=data.iloc[:30,5].values
de=data.iloc[:30,4].values
co=data.iloc[:30,3].values
x=list(data.iloc[:30,0])
plt.figure(figsize=(25,10))
ax=plt.axes()
ax.set_facecolor('black')
ax.grid(linewidth=0.4, color='#8f8f8f')
plt.xticks(rotation='vertical',
size='20',
color='white')#ticks of X
plt.yticks(size='20',color='white')
ax.set_xlabel('\nDistrict',size=25,
color='#4bb4f2')
ax.set_ylabel('No. of cases\n',size=25,
color='#4bb4f2')
plt.tick_params(size=20,color='white')
ax.set_title('Maharashtra District wise breakdown\n',
size=50,color='#28a9ff')
plt.bar(x,co,label='re')
plt.bar(x,re,label='re',color='green')
plt.bar(x,de,label='re',color='red')
for i,j in zip(x,co):
ax.annotate(str(int(j)),
xy=(i,j+3),
color='white',
size='15')
plt.legend(['Confirmed','Recovered','Deceased'],
fontsize=20)
输出:
我们得到一个关于执行上述代码的简单图,看起来像这样,其中 X 轴有日期,Y 轴有已确认病例数。但这不是沿轴的大型数据集值的最佳表示,因为您可以看到“日期”在 X 轴上重叠。为了克服这一挑战,我们将引入一些新函数来更好地控制图形的美感。
美学
为了控制图形的美感,例如标签、标题、颜色和大小,我们将应用更多功能,如下所示。
plt.figure(figsize=(25,8))
这将为图形创建一个画布,其中第一个值“25”是宽度参数位置,“8”是图形的高度参数位置。
ax = plt.axes()
让我们创建一个图形轴的对象为“ax”,这样更容易实现函数。
ax.grid(linewidth=0.4, color='#8f8f8f')
'.grid'函数可让您在图形上创建网格线。网格线的宽度可以通过简单地传递一个参数'linewidth'并通过传递'color'参数来改变它的颜色来调整。
ax.set_facecolor("black")
ax.set_xlabel('\nDate',size=25,
color='#4bb4f2')
ax.set_ylabel('Number of Confirmed Cases\n',
size=25,color='#4bb4f2')
'.set_facecolor' 让您设置图形的背景颜色,这里是黑色。 '.set_xlabel' 和 '.set_ylabel' 允许您沿两个轴设置标签,其大小和颜色可以更改。
ax.plot(X,Y,
color='#1F77B4',
marker='o',
linewidth=4,
markersize=15,
markeredgecolor='#035E9B')
现在我们通过调用 plot函数再次绘制图表,将“X”作为 Dates,将“Y”作为 Daily Confirmed。绘图线、标记和颜色可以通过传递颜色、线宽?—?改变颜色和调整绘图线和标记的宽度,标记大小,标记边缘颜色?—?创建标记,在这种情况下是圆形,调整标记的大小并定义标记的边缘颜色。
完整代码:
Python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('case_time_series.csv')
Y = data.iloc[61:,1].values
R = data.iloc[61:,3].values
D = data.iloc[61:,5].values
X = data.iloc[61:,0]
plt.figure(figsize=(25,8))
ax = plt.axes()
ax.grid(linewidth=0.4, color='#8f8f8f')
ax.set_facecolor("black")
ax.set_xlabel('\nDate',size=25,color='#4bb4f2')
ax.set_ylabel('Number of Confirmed Cases\n',
size=25,color='#4bb4f2')
ax.plot(X,Y,
color='#1F77B4',
marker='o',
linewidth=4,
markersize=15,
markeredgecolor='#035E9B')
输出:
我们仍然可以看到日期是重叠的,并且沿轴的标签不够清晰。所以现在我们要改变坐标轴的刻度并注释绘图。
plt.xticks(rotation='vertical',size='20',color='white')
plt.yticks(size=20,color='white')
plt.tick_params(size=20,color='white')
'.xticks' 和 '.yticks' 让您可以更改 Dates 和 Daily Confirmed 字体。为了使日期不相互重叠,我们将通过传递“旋转 = 垂直”来垂直表示它们。为了使刻度易于阅读,我们将字体颜色更改为白色并将大小更改为 20。
'.tick_params' 让您可以更改虚线的大小和颜色,这些虚线看起来就像是刻度线和图形之间的桥梁。
for i,j in zip(X,Y):
ax.annotate(str(j),xy=(i,j+100),
color='white',size='13')
'.annotate' 让您在图表上进行注释。在这里,我们编写了一个代码来通过运行一个在绘图点处绘图的 for 循环来注释绘图点。 str(j) 包含每日确认的“Y”变量。将绘制任何传递的字符串。 XY 是应绘制字符串的坐标。最后可以定义颜色和大小。请注意,我们在 XY 坐标中为 j 添加了 +100,这样字符串就不会与标记重叠,并且它在 Y?-? 轴上的距离为 100 个单位。
ax.annotate('Second Lockdown 15th April',
xy=(15.2, 860),
xytext=(19.9,500),
color='white',
size='25',
arrowprops=dict(color='white',
linewidth=0.025))
要注释指向图中某个位置的箭头及其包含字符串的尾部,我们可以定义“arrowprops”参数及其由“xytext”定义的尾部坐标。请注意,可以使用字典来完成“箭头道具”的更改。
plt.title("COVID-19 IN : Daily Confirmed\n",
size=50,color='#28a9ff')
最后我们通过'.title'定义一个标题并传递字符串,它的大小和颜色。
完整代码:
Python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('case_time_series.csv')
Y = data.iloc[61:,1].values
R = data.iloc[61:,3].values
D = data.iloc[61:,5].values
X = data.iloc[61:,0]
plt.figure(figsize=(25,8))
ax = plt.axes()
ax.grid(linewidth=0.4, color='#8f8f8f')
ax.set_facecolor("black")
ax.set_xlabel('\nDate',size=25,color='#4bb4f2')
ax.set_ylabel('Number of Confirmed Cases\n',
size=25,color='#4bb4f2')
plt.xticks(rotation='vertical',size='20',color='white')
plt.yticks(size=20,color='white')
plt.tick_params(size=20,color='white')
for i,j in zip(X,Y):
ax.annotate(str(j),xy=(i,j+100),color='white',size='13')
ax.annotate('Second Lockdown 15th April',
xy=(15.2, 860),
xytext=(19.9,500),
color='white',
size='25',
arrowprops=dict(color='white',
linewidth=0.025))
plt.title("COVID-19 IN : Daily Confirmed\n",
size=50,color='#28a9ff')
ax.plot(X,Y,
color='#1F77B4',
marker='o',
linewidth=4,
markersize=15,
markeredgecolor='#035E9B')
输出:
饼形图
我们将绘制传播饼图,以根据旅行、地点访问和未知原因了解病毒的传播方式。
初始化数据集
slices = [62, 142, 195]
activities = ['Travel', 'Place Visit', 'Unknown']
因此,我们创建了列表切片,根据这些切片我们的饼图将被划分,并且相应的活动是它的价值。
绘制饼图
cols=['#4C8BE2','#00e061','#fe073a']
exp = [0.2,0.02,0.02]
plt.pie(slices,
labels=activities,
textprops=dict(size=25,color='black'),
radius=3,
colors=cols,
autopct='%2.2f%%',
explode=exp,
shadow=True,
startangle=90)
plt.title('Transmission\n\n\n\n',color='#4fb4f2',size=40)
为了绘制饼图,我们调用“.pie”函数,该函数采用 x 值,即此处的“切片”,根据它,饼图被划分,然后是标签,标签具有对应的字符串代表的值。这些字符串值可以通过“textprops”进行更改。要更改饼图的半径或大小,我们称之为“半径”。对于美学,我们将“阴影”称为 True 和“startangle”= 90。我们可以通过传递相应颜色的列表来定义要分配的颜色。为了隔开每一块饼,我们可以将对应值的列表传递给“explode”。 'autopct' 定义了允许显示的位置数。在这种情况下,autopct 允许小数点前后 2 个位置。
完整代码:
Python3
slices = [62, 142, 195]
activities = ['Travel', 'Place Visit', 'Unknown']
cols=['#4C8BE2','#00e061','#fe073a']
exp = [0.2,0.02,0.02]
plt.pie(slices,labels=activities,
textprops=dict(size=25,color='black'),
radius=3,
colors=cols,
autopct='%2.2f%%',
explode=exp,
shadow=True,
startangle=90)
plt.title('Transmission\n\n\n\n',color='#4fb4f2',size=40)
输出:
条形图
现在我们将绘制最常见的图形类型,即条形图。 w 将在这里绘制一个州的地区冠状病毒病例。
初始化数据集
data = pd.read_csv('district.csv')
data.head()
re=data.iloc[:30,5].values
de=data.iloc[:30,4].values
co=data.iloc[:30,3].values
x=list(data.iloc[:30,0])
're' 商店所有地区的新冠肺炎患者都已康复。
'de' 商店已故的电晕患者计数所有地区。
'co' 商店所有地区的确诊电晕患者都算在内。
'x' 存储区名称。
绘制条形图
plt.figure(figsize=(25,10))
ax=plt.axes()
ax.set_facecolor('black')
ax.grid(linewidth=0.4, color='#8f8f8f')
plt.xticks(rotation='vertical',
size='20',
color='white')#ticks of X
plt.yticks(size='20',color='white')
ax.set_xlabel('\nDistrict',size=25,
color='#4bb4f2')
ax.set_ylabel('No. of cases\n',size=25,
color='#4bb4f2')
plt.tick_params(size=20,color='white')
ax.set_title('Maharashtra District wise breakdown\n',
size=50,color='#28a9ff')
美学代码将与我们在前面的情节中看到的相同。唯一会改变的是调用 bar函数。
plt.bar(x,co,label='re')
plt.bar(x,re,label='re',color='green')
plt.bar(x,de,label='re',color='red')
for i,j in zip(x,co):
ax.annotate(str(int(j)),
xy=(i,j+3),
color='white',
size='15')
plt.legend(['Confirmed','Recovered','Deceased'],
fontsize=20)
要绘制条形图,我们调用“.bar”并将其传递 x 轴和 y 轴值。在这里,我们对所有三种情况(即 Recovered、Confirmed、Deeased)调用了三次绘图函数,并且所有三个值都相对于 y 轴和 x 轴绘制,这三个值都是地区名称。如您所见,我们通过迭代已确认的案例值仅对已确认的数字进行注释。此外,我们提到了“.legend”来表示图表的图例。
完整代码:
Python3
data = pd.read_csv('district.csv')
data.head()
re=data.iloc[:30,5].values
de=data.iloc[:30,4].values
co=data.iloc[:30,3].values
x=list(data.iloc[:30,0])
plt.figure(figsize=(25,10))
ax=plt.axes()
ax.set_facecolor('black')
ax.grid(linewidth=0.4, color='#8f8f8f')
plt.xticks(rotation='vertical',
size='20',
color='white')#ticks of X
plt.yticks(size='20',color='white')
ax.set_xlabel('\nDistrict',size=25,
color='#4bb4f2')
ax.set_ylabel('No. of cases\n',size=25,
color='#4bb4f2')
plt.tick_params(size=20,color='white')
ax.set_title('Maharashtra District wise breakdown\n',
size=50,color='#28a9ff')
plt.bar(x,co,label='re')
plt.bar(x,re,label='re',color='green')
plt.bar(x,de,label='re',color='red')
for i,j in zip(x,co):
ax.annotate(str(int(j)),
xy=(i,j+3),
color='white',
size='15')
plt.legend(['Confirmed','Recovered','Deceased'],
fontsize=20)
输出: