内容正文:
任务9.2 数据可视化库matplotlib的使用
解析中国夏奥之旅
【任务描述】
2022年冬奥会在北京的举行,这让小T有了回顾中国奥运之旅的想法。他收集了中国参加的历年夏季奥运会奖牌,并希望以图形化的界面呈现奖牌数据,从而去发现中国体育健儿在奥运会上成长、变强的历程。
9.2 数据可视化库matplotlib的使用——解析中国夏奥之旅
9.2 数据可视化库matplotlib的使用——解析中国夏奥之旅
图表Matplotlib库:
图表种类?
怎么绘制?
【任务分析】
用matplotlib库实现数据可视化,从中国体育健儿历年金牌获取数折线图、最近一届夏季奥运会各国金牌数量占比饼图、历年各类奖牌数柱状图来分析中国体育健儿的夏季奥运之旅,思路如下:
(1)创建画布,在一块画布上显示这三种图表。
(2)根据数据画出折线图、饼图,柱状图。
(3)保存并显示图表。
9.2 数据可视化库matplotlib的使用——解析中国夏奥之旅
9.2.1 NumPy运算
9.2.2 Matplotlib常见操作
9.2.3 Matplotlib绘制常见图表
9.2.4 任务实现——解析中国夏奥之旅
9.2 数据可视化库matplotlib的使用——解析中国夏奥之旅
9.2.3 Matplotlab绘制常见图表
9.2.3 Matplotlab绘制常见图表
Matplotlib图表有哪些?
怎样绘制?
9.2.3 Matplotlab绘制常见图表
折线图
柱状图
散点图
饼图
9.2.3 Matplotlab绘制常见图表
函数 功能
plt.plot() 绘制折线图
plt.hist() 绘制直方图
plt.bar() 绘制柱状图
plt.pie() 绘制饼图
plt.scatter() 绘制散点图
plt.boxplot() 绘制箱线图
表9-10 matplotlib.pyplot图表函数
1.绘制折线图
年份GDP 国内生产总值(亿元) 第一产业增加值(亿元) 第二产业增加值(亿元) 第三产业增加值(亿元)
2021年 1143669.7 83085.5 450904.5 609679.7
2020年 1013567.0 78030.9 383562.4 551973.7
2019年 986515.2 70473.6 380670.6 535371.0
2018年 919281.1 64745.2 364835.2 489700.8
2017年 832035.9 62099.5 331580.5 438355.9
9.2.3 Matplotlab绘制常见图表
plt.plot([x], y, color,linestyle,marker,**kwargs)
(1)x,y:列表数据类型,表示 x 轴与 y 轴对应的数据;
(2)color:字符串数据类型,表示折线的颜色,常用颜色’b’表蓝色,g表绿色,r表红色,c表青色,y表黄色,w表白色,k表黑色
(3)marker:字符串数据类型,表示折线上数据点处的类型,可取“,”、“*”、“.”、等20种形状,具体取值见表9-1。默认为none。
(4)linestyle:字符串数据类型,表示折线的类型,可取实线“-”、长虚线“--”、点线“-·”短虚线“:”四种线型,默认是“-”。
折线图(Line Chart)是将数据点按照顺序用线段连接起来的图表,其主要功能是查看变量y随着自变量x改变的趋势,适用于随时间变化而连续变化数据的可视化,并从中看出数据增长趋势的变化。
9.2.3 Matplotlab绘制常见图表
颜色字符 说明 颜色字符 说明
'b' 蓝色 'm' 洋红色(magenta)
'g' 绿色 'y' 黄色
'r' 红色 'k' 黑色
'c' 青绿色(cyan) 'w' 白色
'#00FF00' RGB颜色字符串 '0.8' 灰度值字符串
表9-12 Matplotlib主要颜色字符表
9.2.3 Matplotlab绘制常见图表
表9-13 Matplotlib主要线型表
线型字符 说明 颜色字符 说明
'-' 实线 '-.' 点划线
'--' 破折线 ':' 虚线
9.2.3 Matplotlab绘制常见图表
表9-14 Matplotlib点标记表
点标记字符 说明 点标记字符 说明 点标记字符 说明
'.' 点标记 '1' 下花三角标记 'h' 竖六边形标记
',' 像素点标记 '2' 上花三角标记 'H' 横六边形标记
'o' 实心圈标记 '3' 左花三角标记 '+' 十字标记
'v' 倒三角标记 '4' 右花三角标记 'x' x标记
'^' 上三角标记 's' 实心方形标记 'D' 菱形标记
'>' 右三角标记 'p' 实心五角标记 'd' 瘦菱形标记
'<' 左三角标记 '*' 星形标记 '|' 垂直线标记
9.2.3 Matplotlab绘制常见图表
import matplotlib.pyplot as pltplt.figure(num='折线图画布',figsize=(6,6))plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.title("2017-2021国民生产总值折线图") # 添加图表名称plt.xlabel("年份") # 设置X轴名称plt.xticks([1,2,3,4,5],['2017年','2018年','2019年','2020年','2021年']) # 设置X轴标签plt.ylabel("GDP值(万亿)") # 设置Y轴名称
9.2.3 Matplotlab绘制常见图表
【例9-14】2017~2021国内生产总值折线图
【例9-14】2017~2021国内生产总值折线图
plt.plot([1,2,3,4,5],[832035.9,919281.1,986515.2,1013567.0,1143669.7],color="r",linewidth=2,linestyle='-',label='GDP总值', marker='*') # 国民生产总值折线图plt.plot([1,2,3,4,5],[62099.5,64745.2,70473.6,78030.9,83085.5],color="g",linewidth=2,linestyle='-.',label='第一产业', marker='o') # 第一产业plt.plot([1,2,3,4,5],[331580.5,364835.2,380670.6,383562.4,450904.5],color="b",linewidth=2,linestyle='--',label='第二产业', marker='v') # 第二产业plt.plot([1,2,3,4,5],[438355.9,489700.8,535371.0,551973.7,609679.7],color="y",linewidth=2,linestyle=':',label='第三产业', marker='D') # 第三产业plt.legend(['国内生产总值(亿元)','第一产业增加值(亿元)','第二产业增加值(亿元)','第三产业增加值(亿元)']) # 设置图例plt.show()
9.2.3 Matplotlab绘制常见图表
从图中可以明显地看出,我国2017~2021年国民生产总值呈上升趋势,但2020年这种增长趋势有所减缓。尽管如此,2020年我国GDP突破100万亿大关,是世界主要经济体中唯一一个正增长的国家。
9.2.3 Matplotlab绘制常见图表
边学边练:
某同学本月花销如下:衣500元、食1300元、行120元
请帮他画出各项目的折线图。
9.2.3 Matplotlab绘制常见图表
2.绘制柱状图
plt.bar(x,height,width,align,color,*,align=’center’,**kwargs)
(1)x:列表数据类型,表示x轴的数据。
(2)height:列表数据类型,表示条形的高度值。
(3)width:表示每个条形的宽度,默认为0.8。可以指定一个固定值,那么所有的条形都一样宽;或者设置一个列表,分别对每个条形设置不同的宽度。
(4)align:条形对齐方式,有两个可选值:center和edge。center表示每根条形是根据x轴刻度中心对齐, edge则表示条形全部以刻度为起点对齐。如果不指定该参数,默认值是center。
(5)color:每根条形呈现的颜色。可指定一个颜色值,让所有条形呈现同样颜色;或者指定带有不同颜色的列表,让不同条形显示不同颜色。
柱状图是由一系列高度不等的纵向条纹来表示数据分布情况的图表。
9.2.3 Matplotlab绘制常见图表
import matplotlib.pyplot as pltimport numpy as npplt.figure(num='柱状图画布',figsize=(6,6))plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = FalsexYear=['2017年','2018年','2019年','2020年','2021年']x=[1,2,3,4,5]plt.subplot(211) # 两个子图,第一个子图显示国民生产总值柱状图,第二个子图第一二三产业GDP柱状图plt.title("2017-2021年国民生产总值柱状图") #添加图表名称plt.ylabel("GDP值(亿元)") #设置y轴名称plt.bar(xYear,[832035.9,919281.1,986515.2,1013567.0,1143669.7],color="r") # 国民生产总值柱状图
【例9-15】2017~2021年国内生产总值及第一、二、三产业增加值柱状图。
9.2.3 Matplotlab绘制常见图表
plt.subplot(212)plt.title("2017-2021年第一、二、三产业GDP柱状图") # 添加图表名称plt.ylim((0,800000)) # 设置y轴刻度范围,高于最大值,以便显示图例时不遮挡图形plt.xticks((np.array(x)+0.25).tolist(),['2017年','2018年','2019年','2020年','2021年']) # 设置x轴标签plt.bar(x,[62099.5,64745.2,70473.6,78030.9,83085.5],width=0.25,color="g",label='第一产业') #第一产业GDP值柱状图plt.bar((np.array(x)+0.25).tolist(),[331580.5,364835.2,380670.6,383562.4,450904.5],width=0.25,color="b",label='第二产业') # 第二产业GDP值柱状图plt.bar((np.array(x)+0.5),[438355.9,489700.8,535371.0,551973.7,609679.7],width=0.25,color="y",label='第三产业') # 第三产业GDP值柱状图plt.legend(['第一产业增加值(亿元)','第二产业增加值(亿元)','第三产业增加值(亿元)'])plt.show()
9.2.3 Matplotlab绘制常见图表
从图中可以明显地看出,我国2017~2021年国民生产总值呈上升趋势,三个产业的增加值都呈上升趋势。
9.2.3 Matplotlab绘制常见图表
边学边练:
某同学本月花销如下:衣500元、食1300元、行120元
请帮他画出各项目的柱状图。
9.2.3 Matplotlab绘制常见图表
3.绘制散点图
plt.scatter((x, y, s=None, c=None, marker=None, alpha=None, **kwargs)
(1)x,y:array数据类型,表示x轴、y轴对应的数据。
(2)s:数值或一维array数据类型,表示散点的大小,默认为None,
(3)c:接收颜色或者一维的array,表示散点标记的颜色。
(4)marker:表示绘制的点的类型,默认为None。
(5)aplha:0~1的小数,表示散点的透明度,默认为None。
散点图是由一系列高度不等的纵向条纹或者线段来表示数据分布情况的图表。
9.2.3 Matplotlab绘制常见图表
import csv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(num='散点图画布',figsize=(6,6))
plt.title("男女生身高体重散点分布图") #添加图表名称
plt.xlabel("身高(CM)") #设置x轴名称
plt.ylabel("体重(KG)") #设置y轴名称
plt.ylim((40,75)) #设置y轴刻度范围
plt.xlim((150,190))
【例9-16】绘制男、女生身高、体重散点图。
9.2.3 Matplotlab绘制常见图表
with open('9-16HeightWeight.csv', 'r') as f: reader = csv.reader(f) for row in reader: sex=row[2] if sex=='F': # 取得女生的身高体重,并画绿点 X= eval(row[0]) Y = eval(row[1]) plt.scatter(X,Y, s=64, c='g', marker='o',alpha=.5) # 散点大小为64,散点标记类型设置为‘o’对应实习圆,透明度设置为0.5,颜色为绿色 elif sex=='M': X= eval(row[0]) Y = eval(row[1]) plt.scatter(X,Y, s=64, c='r', marker='o',alpha=.8) # 散点大小为64,散点标记类型设置为‘o’,对应实习圆,透明度设置为0.8,颜色为红色 f.close()plt.show()
9.2.3 Matplotlab绘制常见图表
运行结果可以看出女生身高主要集中在160cm~170cm,男生身高主要集中在170cm~180cm。
9.2.3 Matplotlab绘制常见图表
4.绘制饼图
plt.pie(x, labels=None, explode=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,radius=None, **kwargs )
(1)x:array数据类型,表示用于绘制饼图的数据。
(2)labels:array数据类型,指定每一项的名称,默认为None。
(3)explode:array数据类型,表示指定饼图圆心为n个半径,默认为None。
(4)colors:表示颜色的string或者包含颜色字符串的array,表示饼图颜色,默认为None。
(5)autopct :控制饼图内百分比设置,可以使用format function'%1.1f'或者format字符串或者指小数点前后位数(没有用空格补齐)。
(6)pctdistance:float数据类型,指定autopct的位置刻度,默认值为0.6。
(7)labeldistance:float数据类型,label标记的绘制位置,相对于半径的比例,默认值为1.1,如<1则绘制在饼图内侧。
(8)shadow:bool数据类型,在饼图下面画一个阴影。默认值:False,即不画阴影。
将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的和等于100%,这就是饼图。
import matplotlib.pyplot as pltplt.figure(num='饼图图画布',figsize=(6,6))plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签labels= ['第一产业','第二产业','第三产业']x= [83085.5,450904.5,609679.7]explode= (0,0.1,0)plt.pie(x,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=150)plt.title("2021年国民生产总值第一、二、三产业增长值构成饼图")plt.show()
9.2.3 Matplotlab绘制常见图表
【例9-17】2021年国民生产总值及第一、二、三产业增加值饼图。
2021年第一、二、三产业的增长值分布以饼图的形式呈现。
运行结果可以很清晰地看出三个产业的构成情况:第三产业占比最大,对国民生产总值的贡献最大;其次是第二产业;占比最小的是第一产业。
9.2.3 Matplotlab绘制常见图表
边学边练:
某同学本月花销如下:衣500元、食1300元、行120元
请帮他画出各项目花销占比的饼图。
9.2.3 Matplotlab绘制常见图表
9.2.4 任务实现——解析中国夏奥之旅
【任务描述】
小T是一个体育迷,他想要了解历届奥运会上中国奥运健儿的成长足迹,通过观察历届奥运会上中国奥运健儿获得的金牌数据变化情况来实现这一目标,因此他收集并汇总了中国历年参加的夏季奥运会金牌数据统计表;此外,小T还想通过最近一届奥运会上金牌数量来了解世界上的体育大国、强国,因此他还收集了最近一届奥运会(2021年的第32届夏季奥运会)各国金牌数据的统计表,如表9-15所示。
9.2.4 任务实现——解析中国夏奥之旅
9.2.4 任务实现——解析中国夏奥之旅
历届夏季奥运会中国获金牌统计表 第32届夏季奥运会各国获金牌统计表
奥运会届数 年份 举办地 金牌 序号 国家 金牌数
第23届 1984 洛杉矶 15 1 美国 39
第24届 1988 汉城 5 2 中国 38
第25届 1992 巴塞罗那 16 3 日本 27
第26届 1996 亚特兰大 16 4 英国 22
第27届 2000 悉尼 28 5 俄罗斯奥运队 20
第28届 2004 雅典 32 6 澳大利亚 17
第29届 2008 北京 48 7 其他国家 177
第30届 2012 伦敦 38 ……
第31届 2016 里约热内卢 26
第32届 2021 东京 38
表9-15 奥运会相关数据统计表
【任务分析】
用所学的Matplotlib库进行数据可视化,对于第一个观测点,小T只要能观察到数据变化趋势,就可以了解到中国奥运健儿的成长足迹,以折线图或者柱状图来呈现更为合适;第二个观测点可以从百分比的角度观察,以饼图呈现更为合适。鉴于数据存储在9-18-1.csv和9-18-2.csv文件中,需要用到pandas数据处理的相关知识。
(1)创建画布,在一块画布上显示2个子图。
(2)从文件中读取历年夏季奥运会中国获得金牌数,设置子图的名称,并画出折线图和柱状图。
(3)从文件中读取第32届夏季奥运会各国获得金牌数,设置子图的名称,并画出饼图。
(4)显示图表。
9.2.4 任务实现——解析中国夏奥之旅
9.2.4 任务实现——解析中国夏奥之旅
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(num='中国夏奥之旅',figsize=(6,12))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
(1)引入库,画出画布
【例9-18】任务实现:解析中国夏奥之旅。
9.2.4 任务实现——解析中国夏奥之旅
file = open('9-18-1.csv')
df = pd.read_csv(file)
X=df['奥运会届数']
Y=df['金牌']
plt.subplot(211) # 第一个子图显示中国金牌折线图
plt.title("中国历届奥运会所获金牌数量统计图") # 添加图表名称
plt.ylabel("金牌数")
plt.plot(X,Y,color="b",linewidth=2,linestyle='-',label='新生年龄统计', marker ='*') # 折线图
plt.bar(X,Y,color="b")
(2)读入历届夏季奥运会中国获金牌统计表,画出折线图和柱状图
9.2.4 任务实现——解析中国夏奥之旅
file = open('9-18-2.csv')
df = pd.read_csv(file)
plt.subplot(212) # 第二个子图显示第23届东京奥运会各国金牌比例构成饼图
plt.title("第32届奥运会各国金牌比例构成饼图") # 添加图表名称
labels= df['国家']
x= df['金牌数']
patches,l_text,p_text=plt.pie(x,labels=labels,autopct='%1.2f%%',shadow=False)
# l_text是饼图对着文字大小,p_text是饼图内文字大小
for t in p_text:
t.set_size(6)
for t in l_text:
t.set_size(8)
plt.show()
(3)读入第32届夏季奥运会各国获金牌统计表,画出饼图
第32届夏季奥运会各国获金牌统计表
从柱状图、折线图上观察到,随着我国国力的提升,我国运动员在夏季奥运会上的成绩呈上升趋势;再仔细观察可以发现,有两届奥运会的金牌数据异于这种发展趋势,它们是第23和24届奥运会,第24届奥运会金牌数明显少于第23届奥运会,相同情况的还有第29和30届奥运会,第30届奥运会金牌数也明显低于第29届奥运会。经过调研,小T发现第23届奥运会,前苏联等10多个国家未参赛,而使我国运动员少了很多竞争对手,因而获得了比较好的成绩;而29届奥运会是北京奥运会,有主场优势,因而也取得了突破性成绩。
从饼图上看,体育大国、强国有美国、中国、日本、英国、俄罗斯等国家,这些国家也是当今经济实力较强的国家,在综合国力上也都处于领先地位。
9.2.4 任务实现——解析中国夏奥之旅
$$