当我们对数据做简单的处理后,可以得到一份相对干净的数据,只有对干净的数据进行可视化,才能体现数据潜在的规律和内涵。我们依据数据的绘图展示进行分析,对公司或者企业做出进一步的战略部署具有重要的意义,在这节课中我们就要来一起学习展示数据信息的方法。
知识结构
常见可视化图像
有人说图片比文字具有更快速更高效的信息展现能力。
我们来体现一下,首先,大家来阅读一下这个可爱的故事:
这是小兔运南瓜的故事,然后我们再来看这样一张图:
图片中是不是可以更加快速地获取信息呢?
研究表明人类大脑处理图片的速度要比文字快6万倍,视觉内容能再短时间内产生更大的影响力。
所以说,将海量的数据转换成可视化的图形成为了我们展示数据信息的必备技能。
将数据转换成图像的过程叫做数据可视化。Python中包含一些数据可视化的工具,我们可以使用他们获得想要的数据图像展示效果。从今天开始,我们就来认识几个常用的可视化工具。
matplotlib是Python中最常用的可视化工具之一,它的功能非常强大,可以通过调用函数轻松方便地绘制数据分析中常见的各种图像,比如折线图、条形图、柱状图、散点图、箱线图等。
我们来看一下matplotlib可以绘制哪些图。
No1.散点图
在散点图中每个数据是用点来表示的,每个点有两个坐标,x和y,每个x对应一个y,是一组二维信息数据。我们可以通过散点图中散点的疏密程度和变化趋势,清晰地描述两个变量之间的数量关系。
No2.直方图
直方图用来描述数据的分布,可以对类别型数据进行绘图,也可以对连续数据绘图
当对类别数据绘图时,一般横轴表示数据的类别,纵轴表示类别的个数,也称为频数;当对连续数据进行绘图时,一般横轴表示区间,通过将连续数据划分为n个区间(组),分别计算落在区间(组)内的频数,这个频数即为纵轴的值。
No3.柱状图
柱状图用于描述不同分组不同类别数据的关系,柱子的高低表示数值的大小。与直方图区别的是,柱状图纵轴的含义是数值的大小,而直方图纵轴的含义是每个组中包含的数量个数。
No4.折线图
折线图用来描述数据的趋势,可以显示随时间变化的连续数据的数值变动,因此非常适用于展示在相等时间间隔下数据的趋势。
No5.箱线图
箱线图,用于显示一组数据的分散情况。因形状如箱子而得名。它主要反映原始数据分布的特征,里面包含了分位数的概念,将分位数的概念以图形的形式展示。
No6.饼图
饼图用于展示每一项数据相对于所有项总和数据的比例。图中右上角的方框是图例,图例中每一个颜色代表了一项数据,或者一类数据,饼图常用于描述类别型的数据,以直观形式了解每一项(类)占所有数据的百分比。
当然,除了这些图之外,matplotlib还可以绘制一些其它的图像,那么,这些图究竟是如何绘制的呢?
绘图过程
在Python中,我们常用的绘图工具包括matplotlib和Seaborn,Seaborn是基于matplotlib的高级工具库,Seaborn的功能更丰富些,绘图更加简单、多样化,可以绘制更多炫酷的图像
matplotlib是Python数据可视化的基础库,这一关,我们先通过matplotlib对可视化有个简单的认识,了解下如何通过代码将数据进行绘图。
使用matplotlib之前,我们需要将它导入,有以下两种方式导入常用的函数库,下面以导入matplotlib的pyplot模块为例进行代码演示:
from matplotlib import pyplot as plt
#or
import matplotlib.pyplot as plt
第一种方式from在只导入一个模块的时候,和第二种方式的作用是一样的,但是第一种方式import后面可以接多个模块,使用逗号将多个模块分隔开,当导入多个模块的时候,就不要用as设置别名了。
matplotlib中包含了很多模块,而我们绘图中,比较常用的模块是pyplot,pyplot模块中包含了很多的绘图方法,比如,绘制曲线plot( ),绘制直方图hist( ),绘制饼图pie( )等
在as后的plt就作为函数库的别名,我们编写代码时,直接使用plt调用方法或者属性就可以,具体调用方式,后面会有代码示例,一般调用形式为:库名.方法。
使用matplotlib绘制图像我们往往遵循这样的步骤:
在对数据进行绘图之前,首先,我们应该对数据有基本的了解,看下数据有哪些列,列的含义是什么,每个列的类型是什么样子的,下面就让我们阅读下数据吧。
我们要来体验的是:查看风靡全球的游戏pokemon go的数据统计可视化结果。
《精灵宝可梦Go》(Pokemon Go)是由任天堂、Pokemon公司、Niantic公司合作推出的“在现实中捕捉精灵宝可梦”的AR手游(又称《口袋妖怪GO》),熟悉的同学们都知道,游戏的主要目标是在室外捕捉宝可梦然后在道馆使用它们做战斗。当我们不断移动,附近出现宝可梦时,设备便会闪烁和震动来提醒我们扑捉它们。
现在,我们有一组数据集:’pokemon.csv’,数据集中记录了各种宝可梦的信息,比如:
- Number: Pokédex中的Pokémon ID,整型
- Name: Pokémon名称,字符串
- Type_1: 主要类别,字符串
- Type_2: 副类别,字符串
- Total: 基本统计值的和,整型。基本统计值包含以下6个属性:
- HP : 生命值,整型
- Attack: 攻击值,整型
- Defense: 防御值,整型
- Sp_Atk: 特殊攻击值,整型
- Sp_Def: 特殊防御值,整型
- Speed: 速度值,整型
- Generation: 属于第几代Pokémon,整型
- isLegendary: 是否为传说中的Pokémon,布尔值
- Color: Pokémon颜色,字符串
- hasGender: 是否有性别,布尔值
- Pr_male: 可能为男性的概率,浮点型
- Egg_Group_1: 蛋群分组1,字符串
- Egg_Group_2: 蛋群分组2(如果有的话),字符串
- hasMegaEvolution: 是否拥有Mega进化的能力,布尔值
- Height_m: Pokémon的高度(单位为m),浮点型
- Weight_kg: Pokémon的重量(单位为kg),浮点型
- Catch_Rate: 捕获率,整型
- Body_Style: 身体形状,字符串
在这些变量中,我们重点探究的是所有宝可梦以下变量数据的分布情况
是否为传说中的Pokémon(isLegendary)、是否有性别(hasGender)、是否拥有Mega进化的能力(hasMegaEvolution)、Pokémon颜色(Color)、身体形状(Body_Style)、属于第几代Pokémon(Generation)
我们将绘制各变量数据量分布图,最终会得到这样的一张图,这个图里的每个子图分别绘制了一个图像,每个图像表示对一个列或者多个列数据进行可视化:
通过上面的介绍,我们对数据有了初步的介绍,那么,下面,我们按步骤对数据进行可视化,以了解如何通过代码对数据进行绘图。
注意:为了尽快了解使用代码进行绘图的步骤,下面,我们只按照下方的步骤运行老师的代码,重要的事情说三遍,只运行老师的代码,只运行老师的代码,只运行老师的代码,通过运行的结果对绘图有更深刻的理解,但是,在演示步骤的过程中,我们不对代码做解释,关于代码的介绍,我们在后面会进行详细介绍,这里,我们只做初步的了解。
第一步:创建画布
在使用matplotlib绘图的时候首先要做的是创建一个画布,类比于手绘,也就是拿出来一张纸,然后我们将图像绘制在这张纸上。画布在matplotlib中就是一个figure,是一个图形的对象。
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(20, 10))
plt.show()
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(20,10))
plt.show()
<Figure size 1440x720 with 0 Axes>
以上代码的返回结果是一个Figure对象。
表示我们已经创建好了一个figure画板,也就是我们将绘图所用的空白纸铺好了,万事俱备,马上就可以动手绘制了。
第二步:确定绘图区域
在创建好画布之后,接下来我们要做的是思考一下这块画布要如何分区。如果我们只希望绘制一个图像,那么画布就看做一个区域就好。如果想绘制多个图,那么就需要对画布进行分区。
我们可以在画布上确定一个或者多个绘图区域,每块绘制不同的图,每个不同的图都被称作子图。
每个子图中有自己的坐标轴或者坐标系,我们称坐标轴叫做axis。
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(20, 10))
ax1 = plt.subplot(2, 3, 1)
plt.subplot(2, 3, 2, sharey=ax1)
plt.subplot(2, 3, 3, sharey=ax1)
plt.subplot(2, 3, 4)
plt.subplot(2, 3, 5)
plt.subplot(2, 3, 6)
plt.show()
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(20,10))
ax1=plt.subplot(2,3,1)
plt.subplot(2,3,2,sharey=ax1)
plt.subplot(2,3,3,sharey=ax1)
plt.subplot(2,3,4)
plt.subplot(2,3,5)
plt.subplot(2,3,6)
plt.show()
我们在以上的代码中,已经成功地在画布上创建了六张子图,每张子图都包含自己的坐标系,之后的图像就绘制在这六个坐标系中。
第三步:绘制图像
matplotlib提供了多种绘制图像的方法,直接调用函数就可以绘制出想要的可视化图像。
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
pokemon_data = pd.read_csv('pokemon.csv')
plt.figure(figsize=(20, 10))
ax1 = plt.subplot(2, 3, 1)
plt.bar(pokemon_data.isLegendary.value_counts().index, height = pokemon_data.isLegendary.value_counts().values)
plt.subplot(2, 3, 2, sharey=ax1)
plt.bar(pokemon_data.hasGender.value_counts().index, height = pokemon_data.hasGender.value_counts().values)
plt.subplot(2, 3, 3, sharey=ax1)
plt.bar(pokemon_data.hasMegaEvolution.value_counts().index, height = pokemon_data.hasMegaEvolution.value_counts().values)
plt.subplot(2, 3, 4)
plt.bar(pokemon_data.Color.value_counts().index, height = pokemon_data.Color.value_counts().values)
plt.subplot(2, 3, 5)
plt.bar(pokemon_data.Body_Style.value_counts().index, height = pokemon_data.Body_Style.value_counts().values)
plt.subplot(2, 3, 6)
plt.bar(pokemon_data.Generation.value_counts().index, height = pokemon_data.Generation.value_counts().values)
plt.show()
我们分别在这六张子图里绘制了各变量的计数直方图,各图中横轴为每个变量的不同值,纵轴表示的是每个不同值的数据量。
第四步:添加修饰标签
在我们绘制好图像之后,如果我们希望图像可以清楚明了的展现描述的对象,比如说知道这张图的含义是什么,图中x轴表示什么,x轴上的刻度标签是什么,y轴表示什么,y轴的刻度标签是什么,这个时候我们就需要为图像添加一些修饰的标签。
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
pokemon_data = pd.read_csv('pokemon.csv')
#以下两句解决plt.title中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20, 10))
ax1 = plt.subplot(2, 3, 1)
plt.bar(pokemon_data.isLegendary.value_counts().index, height = pokemon_data.isLegendary.value_counts().values)
plt.xticks(pokemon_data.isLegendary.unique())
plt.title('是否为传说类型的数量统计')
plt.xlabel('是否为“传说”')
plt.ylabel('数量')
plt.subplot(2, 3, 2, sharey=ax1)
plt.bar(pokemon_data.hasGender.value_counts().index, height = pokemon_data.hasGender.value_counts().values)
plt.xticks(pokemon_data.hasGender.unique())
plt.title('是否有性别的数量统计')
plt.xlabel('是否有性别')
plt.ylabel('数量')
plt.subplot(2, 3, 3, sharey=ax1)
plt.bar(pokemon_data.hasMegaEvolution.value_counts().index, height = pokemon_data.hasMegaEvolution.value_counts().values)
plt.xticks(pokemon_data.hasMegaEvolution.unique())
plt.title('是否有Mega进化的数量统计')
plt.xlabel('是否有Mega进化')
plt.ylabel('数量')
plt.subplot(2, 3, 4)
plt.bar(pokemon_data.Color.value_counts().index, height = pokemon_data.Color.value_counts().values)
plt.xticks(pokemon_data.Color.unique())
plt.title('颜色的数量统计')
plt.xlabel('颜色')
plt.ylabel('数量')
plt.subplot(2, 3, 5)
plt.bar(pokemon_data.Body_Style.value_counts().index, height = pokemon_data.Body_Style.value_counts().values)
plt.xticks(pokemon_data.Body_Style.unique())
plt.title('身形的数量统计')
plt.xlabel('身形')
plt.ylabel('数量')
plt.subplot(2, 3, 6)
plt.bar(pokemon_data.Generation.value_counts().index, height = pokemon_data.Generation.value_counts().values)
plt.xticks(pokemon_data.Generation.unique())
plt.title('第n代的数量统计')
plt.xlabel('第n代')
plt.ylabel('数量')
plt.show()
我们给每个图像添加了x轴标签和y轴标签,这样就可以清晰明了地看出每个横轴的含义。同时我们也给每个刻度设置了标签,即每个柱形的含义,这样从图中就可以一目了然地知道每个柱形描述的信息。
第五步:修正图像
最后一步是修正图像。对于绘制好的图形,我们可能会发现图形的某些显示有一定的优化空间,比如之前绘制的第五张图中x轴上的标签文字有些长,标签与标签之间会有一些重叠,那么我们可以做一些什么操作呢?
我们可以把每个刻度标签进行旋转,比如旋转90度或者60度,这样就可以将每个刻度标签分开显示了。
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
pokemon_data = pd.read_csv('pokemon.csv')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20, 10))
ax1 = plt.subplot(2, 3, 1)
plt.bar(pokemon_data.isLegendary.value_counts().index, height = pokemon_data.isLegendary.value_counts().values)
plt.xticks(pokemon_data.isLegendary.unique())
plt.title('是否为传说类型的数量统计')
plt.xlabel('是否为“传说”')
plt.ylabel('数量')
plt.subplot(2, 3, 2, sharey=ax1)
plt.bar(pokemon_data.hasGender.value_counts().index, height = pokemon_data.hasGender.value_counts().values)
plt.xticks(pokemon_data.hasGender.unique())
plt.title('是否有性别的数量统计')
plt.xlabel('是否有性别')
plt.ylabel('数量')
plt.subplot(2, 3, 3, sharey=ax1)
plt.bar(pokemon_data.hasMegaEvolution.value_counts().index, height = pokemon_data.hasMegaEvolution.value_counts().values)
plt.xticks(pokemon_data.hasMegaEvolution.unique())
plt.title('是否有Mega进化的数量统计')
plt.xlabel('是否有Mega进化')
plt.ylabel('数量')
plt.subplot(2, 3, 4)
plt.bar(pokemon_data.Color.value_counts().index, height = pokemon_data.Color.value_counts().values)
plt.xticks(pokemon_data.Color.unique())
plt.title('颜色的数量统计')
plt.xlabel('颜色')
plt.ylabel('数量')
plt.subplot(2, 3, 5)
plt.bar(pokemon_data.Body_Style.value_counts().index, height = pokemon_data.Body_Style.value_counts().values)
plt.xticks(pokemon_data.Body_Style.unique(), rotation = 60)
plt.title('身形的数量统计')
plt.xlabel('身形')
plt.ylabel('数量')
plt.subplot(2, 3, 6)
plt.bar(pokemon_data.Generation.value_counts().index, height = pokemon_data.Generation.value_counts().values)
plt.xticks(pokemon_data.Generation.unique())
plt.title('第n代的数量统计')
plt.xlabel('第n代')
plt.ylabel('数量')
plt.show()
下面,让我们一点一点解锁这些疑惑吧,从这里开始,我们就要对代码进行具体的介绍,了解每行代码的具体含义,以及函数和参数的含义,图上的文字是如何出现的,数据和图像关系。
图像的基本元素
matplotlib绘图中的有哪些基本元素呢?主要分为以下三种元素:
变量:
变量一般使用小写英文字母来书写,可以使用下划线进行连接,一个数据赋值给这样一串字符,这个字符便成为了变量,变量的含义要尽可能的表达这个数据的功能,比如,对一个学生的DataFrame数据进行赋值,那么,这个变量可以命名为:student_data
函数:
matplotlib中提供多种绘图函数,可以绘制各种各样的图像,比如,折线图(plot)、散点图(scatterplot)、直方图(hist)、箱线图(boxplot)、饼图(pie)等均是常见的绘图函数。
画布和坐标轴:
我们可以通过调整画布的大小、坐标轴、或者图像中的标签来将数据和绘图函数描述在图像中。
各元素之间的关系:
matplotlib图像的各基本元素之间有什么关系呢?我们来看这样一张图:
这张图可以清楚地展现matplotlib绘图对象的各个基本元素:
首先figure是整个图像的画布,图像就绘制在这个画布中。
在画布上我们可以看到图像有两个坐标轴,横着的坐标轴称做x轴,左侧的竖轴称做y轴,这两个坐标轴就是这里的axis。坐标轴上的0,1,2,3,4,5,6被称为刻度标签,垂直于坐标轴,且和每个数字对应的小棒,称为刻度,xlabel和ylabel被称为轴标签,也称为标签
我们还可以给每个坐标轴设置一个轴名称,也就是label,有xlabel和ylabel。
图像的正上方可以设置挑剔,以说明该图像的作用,图像的标题称为title。
那么中间这条曲线是什么呢,这个就是通过数据和函数绘制出来的图像,也就是基本元素的前两个:变量和函数。
如何设置画布
其实它是由matplotlib中的函数plt.figure()创建的。
当然这条语句也不是必须得书写,如果我们不写这条语句,matplotlib就会默认为我们创建一个画布,然后我们就会在默认创建的这个画布上进行绘图,但是如果想要养成一个良好的编程习惯的话,建议大家最好书写这条语句。
# 设置画布
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
plt.show()
<Figure size 432x288 with 0 Axes>
输出的结果类似于<Figure size 432×288 with 0 Axes>,标识一个Figure对象已经创建成功,也就表示我们成功的创建了一个画布。
如果希望修改画布的长和宽,我们可以使用figure函数中的figsize参数来调整画布的大小。figsize的单位是英寸,我们来看一下如何使用。
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
plt.figure(figsize = (10,5))
pokemon_data = pd.read_csv('pokemon.csv')
plt.bar(pokemon_data.isLegendary.value_counts().index, height = pokemon_data.isLegendary.value_counts().values)
plt.show()
plt.bar(x,y)表示绘制柱状图,它第一个参数x代表一维的数据,会绘制在x轴上,通常是类别型的数据,这个类别型的数据,可以是数值型表示,也可以是字符型表示,第二个参数y代表一维的数据,是连续数据。并且x数据和y数据的长度一致,在图上,x轴上的每个类别均和y的值一一对应。
pokemon_data.isLegendary.value_counts():需要着重介绍的是value_counts( )方法,它表示对isLegendary的每个类别统计个数,会得到一维结构的数据,其中,索引是isLegendary的唯一类别,值为每个类别的个数。
pokemon_data.isLegendary.value_counts().index:.index表示取到一维结构数据的索引值 pokemon_data.isLegendary.value_counts().values:.values表示取到一维结构数据的值
如何创建子图
创建好画布之后,我们可以规划一下整个画布的分区,这样就可以将一张画布分成多个区域,每个区域都可以绘制一个图像,这里的每个图像称为一个子图。
调用plt.subplot()函数就可以创建一个子图,plt.subplot()的使用方法如下:
plt.subplot(nrows, ncols, index)
函数的 nrows 参数指定将数据图区域分成多少行;ncols 参数指定将数据图区域分成多少列;index 参数指定获取第几个区域。
我们可以直接传入三个数字参数,其中第一位数将作为 nrows 参数;第二位数将作为 ncols 参数;第三位数将作为 index 参数。
下面我们创建一个包含2行2列,共4个子图的画布。
那么第一个子图的创建方法就是:
plt.subplot(2, 2, 1)
相应的,第二个子图就使用:plt.subplot(2, 2, 2),以此类推。
import matplotlib.pyplot as plt
import numpy as np
# TODO
# 设置画布尺寸为10*8
# 分别创建4张子图
x = [1,10,14,15,16,17]
y = np.array([3,4,6,2,1,5])
# 画布10*8
plt.figure(figsize = (10,8))
# 第一个子图
# 折线图
plt.subplot(2, 2, 1)
plt.plot(y)
plt.title('y数据的折线图')
#第二个子图
# 折线图,y轴每个数据的立方
plt.subplot(2, 2, 2)
plt.plot(y**3)
plt.title('y立方数据的折线图')
#第三个子图
# 折线图,x轴和y轴均指定数据
plt.subplot(2, 2, 3)
plt.plot(x,y)
plt.title('x/y数据的折线图')
#第四个子图
# 散点图
plt.subplot(2, 2, 4)
plt.scatter(x,y)
plt.title('散点图')
plt.show()
第一个子图,对y轴数据绘制折线图;第二个子图对y的立方数据绘制折线图;第三个子图,设定x轴为x数据,y轴为y数据;第四个子图,根据x数据和y数据绘制散点图,x和y数据一一对应,每一对值,在图上体现为一个点。
总结
作业
股票之声
这个项目中,我们将对3个汽车行业的美股行情进行分析
- 特斯拉
- 福特
- 通用
# 导入项目使用的模块
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
# TODO
# 读取文件tsla_data.csv、ford_data.csv、gm_data.csv的数据,分别赋值给tl_data、fd_data、gm_data
# 由于数据文件均存储在data文件夹下,导入tsla_data数据的路径为:eg:'../data/tsla_data.csv',其它文件数据导入类似
# 读取数据时,使用pd.read_csv( ) 函数
tl_data=pd.read_csv("tsla_data.csv")
fd_data=pd.read_csv("ford_data.csv")
gm_data=pd.read_csv("gm_data.csv")
# TODO
# 查看各数据前五行
print('----------------特斯拉----------------')
print(tl_data.head())
print('-----------------福特-----------------')
print(fd_data.head())
print('-----------------通用-----------------')
print(gm_data.head())
----------------特斯拉----------------
Unnamed: 0 date 1. open 2. high 3. low 4. close \
0 0 2010-06-29 19.00 25.0000 17.54 23.89
1 1 2010-06-30 25.79 30.4192 23.30 23.83
2 2 2010-07-01 25.00 25.9200 20.27 21.96
3 3 2010-07-02 23.00 23.1000 18.71 19.20
4 4 2010-07-06 20.00 20.0000 15.83 16.11
5. adjusted close 6. volume 7. dividend amount 8. split coefficient
0 23.89 18766300.0 0.0 1.0
1 23.83 17187100.0 0.0 1.0
2 21.96 8218800.0 0.0 1.0
3 19.20 5139800.0 0.0 1.0
4 16.11 6866900.0 0.0 1.0
-----------------福特-----------------
Unnamed: 0 date 1. open 2. high 3. low 4. close \
0 0 3/01/2000 52.75 53.19 52.13 52.38
1 1 4/01/2000 51.81 52.25 50.31 50.63
2 2 5/01/2000 51.00 51.50 50.75 50.81
3 3 6/01/2000 51.00 51.81 50.38 50.88
4 4 7/01/2000 52.50 55.00 52.13 54.63
5. adjusted close 6. volume 7. dividend amount 8. split coefficient
0 24.5595 2582177 0.0 1
1 23.7390 4660980 0.0 1
2 23.8234 3207002 0.0 1
3 23.8562 2892998 0.0 1
4 25.6144 5898154 0.0 1
-----------------通用-----------------
Unnamed: 0 date 1. open 2. high 3. low 4. close \
0 0 2010-11-18 35.00 35.99 33.89 34.19
1 1 2010-11-19 34.15 34.50 33.11 34.26
2 2 2010-11-22 34.20 34.48 33.81 34.08
3 3 2010-11-23 33.95 33.99 33.19 33.25
4 4 2010-11-24 33.73 33.80 33.22 33.48
5. adjusted close 6. volume 7. dividend amount 8. split coefficient
0 28.1855 457044300.0 0.0 1.0
1 28.2432 107842000.0 0.0 1.0
2 28.0948 36650600.0 0.0 1.0
3 27.4106 31170200.0 0.0 1.0
4 27.6002 26138000.0 0.0 1.0
绘制单个图
# TODO
# 对特斯拉股票的开盘价绘制折线图
plt.plot(tl_data['1. open'])
[<matplotlib.lines.Line2D at 0x1e9c65d3c08>]
# TODO
# 对福特股票的开盘价绘制折线图,要求设置标题为'Trend chart for Ford US stock opening price data'
plt.plot(fd_data['1. open'])
plt.title("Trend chart for Ford US stock opening price data")
Text(0.5, 1.0, 'Trend chart for Ford US stock opening price data')
# TODO
# 对通用股票的开盘价数据做可视化,要求设置标题为:'Trend chart for GM US stock opening price data'
# x轴标签为'index of GM US stock',y轴标签为: 'opening price data'
plt.plot(gm_data['1. open'])
plt.title('Trend chart for GM US stock opening price data')
plt.xlabel('index of GM US stock')
plt.ylabel("opening price data")
Text(0, 0.5, 'opening price data')
绘制子图,分析每种汽车的开盘价,最高价,最低价,收盘价的趋势
问:在上面我们对每只股票的开盘价一一绘制了折线图,但是,当需要对多个指标开盘价,最高价,最低价,收盘价进行观察的话,如何绘图会更方便我们观察结果呢?
答:可以通过绘制子图,对每只股票的指标进行并列绘制,这样方便我们对股票的各个指标的趋势进行观察
# TODO
# 创建一个15 * 8的画布
plt.figure(figsize=(15,8))
# TODO
# 创建一个3 * 4的图,每一行的子图分别依次绘制这只股票的开盘价,最高价,最低价,收盘价的折线图
# 以下的空白处需要补全代码,请按照文字描述将代码补充完整
# 特斯拉的开盘价,最高价,最低价,收盘价的折线图
plt.subplot(3,4,1)
plt.plot(tl_data['1. open'])
plt.subplot(3,4,2)
plt.plot(tl_data['2. high'])
plt.subplot(3,4,3)
plt.plot(tl_data['3. low'])
plt.subplot(3,4,4)
plt.plot(tl_data['4. close'])
# 福特的开盘价,最高价,最低价,收盘价的折线图
plt.subplot(3,4,5)
plt.plot(fd_data['1. open'])
plt.subplot(3,4,6)
plt.plot(fd_data['2. high'])
plt.subplot(3,4,7)
plt.plot(fd_data['3. low'])
plt.subplot(3,4,8)
plt.plot(fd_data['4. close'])
# 通用的开盘价,最高价,最低价,收盘价的折线图
plt.subplot(3,4,9)
plt.plot(gm_data['1. open'])
plt.subplot(3,4,10)
plt.plot(gm_data['2. high'])
plt.subplot(3,4,11)
plt.plot(gm_data['3. low'])
plt.subplot(3,4,12)
plt.plot(gm_data['4. close'])
[<matplotlib.lines.Line2D at 0x1e9c686f7c8>]
医疗支出总览
这个项目中,我们将对各国家医疗总支出费用进行探究,并且绘制各变量分布趋势图。
数据集中含有以下列:
- Country: 国家
- Region: 地区
- Year: 年份
- Population: 人口
- LifeExpectancy: 平均期望寿命
- HealthExpenditure: 人均医疗消费支出/$100
# 导入项目使用模块
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
# 读取数据,数据在data文件夹中
# 读取txt文件使用pd.read_table,sep是分隔符,默认为逗号分割,当数据不使用逗号分割时,读数据的时候,需要指定sep的值,由于数据中使用空格进行分割数据,所以这里sep=' '空格
health = pd.read_csv('health.txt')
# health.to_csv('../../tmp/health.txt')
health.head()
Unnamed: 0 | Country | Region | Year | Population | LifeExpectancy | HealthExpenditure | |
---|---|---|---|---|---|---|---|
0 | 0 | Albania | Europe & Central Asia | 1995 | 3141102.0 | 71.870293 | 0.282246 |
1 | 1 | Algeria | Middle East & North Africa | 1995 | 28291591.0 | 68.465878 | 0.620559 |
2 | 2 | Angola | Sub-Saharan Africa | 1995 | 12105105.0 | 42.050927 | 0.207486 |
3 | 3 | Argentina | Latin America & Caribbean | 1995 | 34855160.0 | 72.623634 | 6.154143 |
4 | 4 | Armenia | Europe & Central Asia | 1995 | 3223173.0 | 68.620463 | 0.257381 |
分析人均寿命和医疗消费支出的情况
# TODO
# 依据数据集中的医疗消费支出和人均寿命绘制散点图,分析医疗消费支出和人均寿命的关系
plt.scatter(health['HealthExpenditure'],health['LifeExpectancy'])
<matplotlib.collections.PathCollection at 0x1e9c641dc48>
分析中国、加拿大、澳大利亚指标之间的关系
分析1995-2011年,中国,加拿大,澳大利亚人的平均寿命、医疗消费支出、人口之间的关系
# TODO
# 分别筛选国家'Country'为'China','Canada','Australia'的数据
# 分别赋值给变量: China_data, Canada_data, Aus_data
China_data = health[health['Country']=='China']
Canada_data = health[health['Country']=='Canada']
Aus_data = health[health['Country']=='Australia']
print(China_data.Year)
32 1995
201 1996
370 1997
539 1998
708 1999
877 2000
1046 2001
1215 2002
1384 2003
1553 2004
1722 2005
1891 2006
2060 2007
2229 2008
2398 2009
2567 2010
2736 2011
Name: Year, dtype: int64
# TODO
# 创建画布,画布尺寸为20*15
plt.figure(figsize=(20,15))
# TODO
# 绘制一个3 * 3的子图,每一行的3个子图分别是关于医疗消费支出、平均寿命、人口数量
# 以下会对子图的绘制提供详细描述
# 在大的空白处按照注释补全代码
# 绘制中国,加拿大,澳大利亚三个国家的医疗消费支出折线图
# 其中,以x轴为年份数据,以y轴为医疗消费支出数据,
# 且为每个子图设置标题:'XX人均医疗消费支出折线图',XX要替换为对应的国家名称
plt.subplot(3,3,1)
plt.plot(China_data.Year,China_data.HealthExpenditure)
plt.title('中国人均医疗消费支出折线图')
plt.subplot(3,3,2)
plt.plot(Canada_data.Year, Canada_data.HealthExpenditure)
plt.title('加拿大人均医疗消费支出折线图')
plt.subplot(3,3,3)
plt.plot(Aus_data.Year,Aus_data.HealthExpenditure)
plt.title("澳大利亚 人均消费支出折线图")
# 绘制中国,加拿大,澳大利亚三个国家的平均寿命的折线图
# 其中,以x轴为年份数据,以y轴为平均寿命的数据,
# 且为每个子图设置标题:'XX人平均寿命折线图',XX要替换为对应的国家名称
plt.subplot(3,3,4)
plt.plot(China_data.Year, China_data.LifeExpectancy)
plt.title('中国人平均寿命折线图')
plt.subplot(3,3,5)
plt.plot(Canada_data.Year, Canada_data.HealthExpenditure)
plt.title('加拿大人平均寿命折线图')
plt.subplot(3,3,6)
plt.plot(Aus_data.Year, Aus_data.LifeExpectancy)
plt.title('澳大利亚人平均寿命折线图')
# 绘制中国,加拿大,澳大利亚三个国家的人口数量的折线图
# 其中,以x轴为年份数据,以y轴为人口数量的数据,
# 且为每个子图设置标题:'XX人口数量折线图',XX要替换为对应的国家名称
plt.subplot(3,3,7)
plt.plot(Canada_data.Year,Canada_data.Population)
plt.title("中国人口数量折线图")
plt.subplot(3,3,8)
plt.plot(Canada_data.Year, Canada_data.Population)
plt.title('加拿大人口数量折线图')
plt.subplot(3,3,9)
plt.plot(Aus_data.Year,Aus_data.Population)
plt.title('澳大利亚人口数量折线图')
plt.show()
今天的文章初识Python中matplotlib绘图分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66887.html