2-1Matplotlib介绍与安装
什么是Matplotlib
Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。
为什么要学习Matplotlib
- 将数据进行可视化,使数据更直观
- 使数据更加更具有说服力
Matplotlib安装
由于Matplotlib是第三方库,所以我们需要安装它才可以使用。注意,Matplotlib3.0要求python3版本才可安装使用。
安装命令:pip install matplotlib
eg: pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
安装可参考官网:https://matplotlib.org/users/installing.html
已安装好的
还可以pip freeze pip list 查看已安装得第三方库
2-2Matplotlib绘图
图片与子图
Matplotlib所绘制的图位于图片(Figure)对象中。我们可以通过plt.figure生成一个新的图片:
from matplotlib import pyplot as plt
fig = plt.figure()
创建一个新的figure对象
返回值就是返回这个figure对象
注意
• 在IPython中,执行该代码一个空白的绘图窗口就会出现,但在Jupyter中则没有任何显示
但是可以通过plt.subplot创建一个或多个子图。
如:带有四个子图的Matplotlib图片
plt.subplot()
Add a subplot to the current figure.在当前图形中添加子图。
plt.subplot(221)
这么写
绘制图形,比如(x,y)构成点
若是直接用plt.scatter(range(10),range(10))直接绘制,默认最后一个子图绘制图形。
当我们使用pycharm时
记得把这个勾选 inherit global site-packages继承全局网站包
plt.show() 呈现图片 这样在pycharm中才能看到图片
plt.subplots()
创建figure对象并且设置子图
subplots()不仅创建了一个figure对象还添加了子图,是更便捷的。
返回值是figure对象和子图
除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片,然后返回包含了已生成子图对象的Numpy数组。
• plt.subplots(nrows, ncols, sharex, sharey)
• nrows子图的行数
• ncols子图的列数
• sharex 所有子图使用相同的x轴刻度
• sharey 所有子图使用相同的y轴刻度
axs[0,0]的效果和axs[0][0]结果一样
axs[0,0]第0行第0列 也就是左上角的子图
加上plt.show()就是最终结果了
如果仅用一个变量axs接收返回值,就会返回一个元组
但是我们画图仅仅用axs就行了,所以这里还需要拆包
这样显然更麻烦所以不推荐
那么实际上,当我们不需要使用子图时(仅需一张图),可以通过plt对象直接绘制图形。
Matplotlib绘制图形
matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等。
具体可参考:https://matplotlib.org/gallery/index.html
折线图
折线图介绍
折线图以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况
折线图绘制
若是x 的值值数量与y值的数量不匹配,也就是xy不是等长的
Docstring:
Plot y versus x as lines and/or markers
文档字符串:
将y与x绘制为直线和/或标记
其实plot就是绘制的意思
Parameters就是参数的意思
折线图可以通过plot()函数来绘制
• plt.plot(x, y) # 使用默认的线样式及颜色绘制x,y构建的图形
实例
数据如下,绘制折线图形
• x = [1,2,3,4]
• y = [2,3,1,2]
import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,3,1,2]
plt.plot(x,y)
plt.show()
以上实例,x数组对应图形x轴的值,y数组对应图形y轴的值,并且通过plt.plot()绘制之后,通过plt.show()展示图片,释放内存。
并且,plt.plot()函数除了传入制图数据,还可以设置线的颜色等。
• color 设置线的颜色
• linestyle 设置线的样式
• marker 标记样式
代码如下
import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,3,1,2]
plt.plot(x,y,color="g",linestyle="--")
plt.show()
效果如下
plt.plot()参数使用具体可参考:https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plot
https://matplotlib.org/api/markers_api.html#module-matplotlib.markers
练习
假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形。
图形组成(图形的组件)
实际上,图形的组成除了x,y轴。还有很多组件。如下图
改刻度
若使刻度变为
range(0,24,0.5)这样行吗,当然是不行的,因为步长只能是整数。
x_t=[i/2 for i in range(0,48)]
x_t[0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5]
字太挤了,把画布变大些。
此处的figsize的传参数是有考究的
可看出只能传元组或者列表,因为元组不可变,我们传元组。
后面还可以加一个参数 使刻度旋转
rotation
然后呢需求又变了
!!!
!!!
完整步郰
上面的写法是对的,但是下面写法就是错的,就因为不在列表中。
中文显示问题
当我们需要设置轴标签,标题等,通常会使用到中文。但是,matplotlib默认不显示中文,如图:
解决方法
方法一
该设置方法是全局的,而且只支持ttf的不支持ttc的。
import matplotlib
font = {'family':'SimHei','weight':'bold','size':12
}
matplotlib.rc("font", **font)
仅仅需要记住是matplotlib下的rc 模块中,而且下面又很多字体的例子
方法二
大部分都用的方法,全局设置
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
方法三
既支持ttc字体,又支持ttf字体。局部设置
从字体管理器matplotlib.font_manager中导入字体样式FontProperties,再把这个字体样式实例化 再指定设置字体的路径,相当于把这个字体注册到matplotlib的字体库中去了。
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
x = [1,2,3,4]
y = [3,2,1,3]
plt.plot(x,y)
plt.xlabel("x轴标签",fontproperties=font)
plt.show()
练习1
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况
首先要用到模块random
左右两边的值都能取到的
小结
练习2
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
要求:
• y轴表示个数
• x轴表示岁数,比如11岁,12岁
添加注释文本
plt.annotate() 基本使用
• text 是注释的文本
• xy 是需要注释的点的坐标
• xytext 是注释文本的坐标
• arrowprops 是箭头的样式属性
散点图
散点图介绍
散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
特点:判断变量之间是否存在数量关联趋势,表示离群点(分布规律)
散点图绘制
散点图通过scatter()函数绘制
• plt.scatter(x,y) # 以默认的形状颜色等绘制散点图
练习1
假设通过爬虫你获取到了长沙2019年4,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间变化的某种规律
a = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]
练习2
为了对某一产品进行合理定价,我们对此类商品进行了试销实验,价格与需求量数据如下。利用图表分析规律。
价格
60
80
40
30
70
90
95
需求量
100
50
120
135
65
45
40
price = [60,80,40,30,70,90,95]
sales = [100,50,120,135,65,45,40]
条形图
条形图介绍
条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图。
特点
• 能够使人们一眼看出各个数据的大小。
• 易于比较数据之间的差别。
条形图绘制
条形图通过bar()函数绘制
• plt.bar(x, height) # 绘制以x为x轴位置,height为y轴位置的竖条形图
水平条形图绘制
水平条形图通过barh()函数绘制
• plt.barh(y, width) # 绘制以y为y轴位置,width为y轴位置的水平条形图
练习1
假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据
a = [“流浪地球”,“复仇者联盟4:终局之战”,“哪吒之魔童降世”,“疯狂的外星人”,“飞驰人生”,“蜘蛛侠:英雄远征”,“扫毒2天地对决”,“烈火英雄”,“大黄蜂”,“惊奇队长”,“比悲伤更悲伤的故事”,“哥斯拉2:怪兽之王”,“阿丽塔:战斗天使”,“银河补习班”,“狮子王”,“反贪风暴4”,“熊出没”,“大侦探皮卡丘”,“新喜剧之王”,“使徒行者2:谍影行动”,“千与千寻”]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22] 单位:亿
数据来源:http://58921.com/alltime/2017
练习2
水果
Q1销售额
Q2销售额
苹果
1000
1200
梨子
800
700
车厘子
3000
2800
练习3
根据练习1的数据,绘制水平条形图。
直方图
直方图介绍
直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况
特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计)
直方图绘制
直方图通过hist()函数绘制
• plt.hist(x, bins=None) # 绘制以x为数值,bins为组数
• 组数 = 极差/组距
练习
某地区连续50年中四月份平均气温数据如下:
temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
根据以上数据,推断该地区四月份平均气温的分布类型。
解析:样本中最小值a=3.0,最大值b=9.7。则分布区间[3,10]等分为7个小区间,区间长度为1,以下为样本值在各小区间的频数与评率。
区间
频数
频率
[3,4]
1
1/50
(4,5]
6
6/50
(5,6]
11
11/50
(6,7]
15
15/50
(7,8]
9
9/50
(8,9]
6
6/50
(9,10]
2
2/50
练习2
绘制班级的身高分布图形
height = [160,163,175,180,176,177,168,189,188,177,174,170,173,181]
扇形图(Pie)
扇形图介绍
扇形图,用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。
扇形图绘制
扇形图通过pie()函数绘制
• plt.pie(x, explode=None, labels=None)
• x 扇形数据
• explode 设置某几个分块是否要分离饼图
• labels 每块扇形标签
• autopct 百分比数据标签
• shadow 是否显示阴影
• plt.pie()有3个返回值
• patches 绘制饼图每一块的对象
• texts 文本的列表
• autotexts 百分比的文本列表
练习
将以下frac数据绘制扇形图,并且设置其扇形标签为label
frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
label = [’[3,4]’,’(4,5]’,’(5,6]’,’(6,7]’,’(7,8]’,’(8,9]’,’(9,10]’]
雷达图
雷达图介绍
雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况。比如某个企业在哪些业务方面的投入等,都可以用雷达图方便的表示。
绘制雷达图
在matplotlib.pyplot中,可以通过plt.polar来绘制雷达图,这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2*PI=360°)。
小栗子
如下数据,进行绘制雷达图
quaters = [‘Q1’,‘Q2’,‘Q3’,‘Q4’,‘Q5’,‘Q6’,‘Q7’]
sales = [40,91,44,90,20,54,80]
注意:
• 因为polar并不会完成线条的闭合绘制,所以我们在绘制的时候需要在theta中和values中在最后多重复添加第0个位置的值,然后在绘制的时候就可以和第1个点进行闭合了。
• polar只是绘制线条,所以如果想要把里面进行颜色填充,那么需要调用fill函数来实现。
• polar默认的圆圈的坐标是角度,如果我们想要改成文字显示,那么可以通过xticks来设置。
箱型图
箱型图介绍
箱线图是一种直观简洁的方式去呈现一组数据的分布。 箱线图广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值。
• 最大值
• 最小值
• 中位数
• 下四分位数(Q1)
• 上四分位数(Q3)
箱型图绘制
Python当中可以使用Matplotlib当中的boxplot()绘制箱型图,绘制效果如下。
plt.boxplot()
• x:需要绘制的箱型图的数据
• notch:是否展示置信区间 默认为False
• sym:代表异常点的符号表示 默认为圆点
• vert:是否是垂直的 默认是True
• whis:上下限系数 默认为1.5
• positions:设置每个盒子的位置
• widths:设置每个盒子的宽度
• labels:每个盒子的label
• meanline和showmean:都为True的时候 会展示平均线
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
data = np.random.randint(1,100,size=100)
data = np.append(data,np.array([-100,300])) # 添加两个异常值
plt.boxplot(data,sym="^",widths=0.2,meanline=True,showmeans=True)
plt.show()
绘图参考链接:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot