参考《Python数据分析与应用》
Matplotlib首次发表于2007年,在函数设计上参考里MATLAB,其名字以“Mat”开头,中间的“plot”表示绘图这一作用,而结尾的“lib”则表示它是一个集合。
Matplotlib中应用最广的是matplotlib.pyplot模块。pyplot是一个命令风格函数的集合,使Matplotlib更像MATLAB。
基础语法及常用参数
基础语法
1.创建画布与创建子图
可以指定画布的大小、像素及在同一副图中绘制多个图形。
函数名称 | 函数作用 |
---|---|
plt.figure | 创建一个空白画布,可以指定画布的大小、像素 |
figure.add_subplot | 创建并选中子图,可以指定子图的行数、列数和选中图片的编号 |
2.添加画布内容
其中各项步骤是并列的,没有先后顺序,但是添加图例一定要在绘制图形之后。
函数名称 | 函数作用 |
---|---|
plt.title | 在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等参数 |
plt.xlable | 在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数 |
plt.ylable | 在当前图形中添加y轴名称,可以指定位置、颜色、字体大小等参数 |
plt.xlim | 指定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符串标识 |
plt.ylim | 指定当前图形y轴的范围,只能确定一个数值区间,而无法使用字符串标识 |
plt.xticks | 指定x轴刻度的数目与取值 |
plt.yticks | 指定y轴刻度的数目与取值 |
plt.legend | 指定当前图形的图例,可以指定图例的大小、位置、标签 |
3.保存与显示图形
函数名称 | 函数作用 |
---|---|
plt.savafig | 保存绘制的图形,可以指定图形的分辨率、边缘的颜色等参数 |
plt.show | 在本机显示图形 |
下面展示 基础绘图语法
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(0, 1.1, 0.01)
plt.title('lines', fontsize=24)
#添加顶部标题,第一个参数为标题,第二个参数设定字体大小
plt.xlabel('x', fontsize=14) #添加x轴的名称
plt.ylabel('y', fontsize=14) #添加y轴的名称
plt.xlim((0,1)) #确定x轴的范围
plt.ylim((0,1)) #确定y轴的范围
plt.xticks([0,0.2,0.4,0.6,0.8,1]) #确定x轴的刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1]) #确定y轴的刻度
plt.tick_params(axis='both', labelsize=14) #设定刻度标记大小
plt.plot(data, data**2 , linewidth=5)
#添加y=x^2的曲线,第一个参数为x轴数据,第二个参数为y轴数据,第三个参数设定线条宽度
plt.plot(data, data**4, linewidth=5) #添加y=x^4的曲线
plt.legend(['y=x^2','y=x^4']) #添加图例
plt.savefig('squares_x.png', bbox_inches='tight')
#保存图形,第一个参数为文件名,第二个参数表示将多余的空白裁剪掉
plt.show() #显示图形
以下为运行结果
下面展示 包含子图的基础绘图语法
import numpy as np
import matplotlib.pyplot as plt
rad = np.arange(0, np.pi*2, 0.01)
#第一幅子图
pl = plt.figure(figsize=(8,6), dpi=80) #确定画布大小
axl = pl.add_subplot(2,1,1) #创建一个2行1列的子图,并开始绘制第一幅
plt.title('lines') #添加标题
plt.xlabel('x') #添加x轴名称
plt.ylabel('y') #添加y轴名称
plt.xlim((0,1)) #确定x轴范围
plt.ylim((0,1)) #确定y轴范围
plt.xticks([0,0.2,0.4,0.6,0.8,1]) #确定x轴的刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1]) #确定y轴的刻度
plt.plot(rad, rad**2) #添加y=x^2的曲线
plt.plot(rad, rad**4) #添加y=x^4的曲线
plt.legend(['y=x^2', 'y=x^4'])
#第二幅子图
ax2 = pl.add_subplot(2,1,2) #开始绘制第二幅
plt.title('sin/cos') #添加标题
plt.xlabel('rad') #添加x轴标题
plt.ylabel('value') #添加y轴标题
plt.xlim((0,np.pi*2)) #确定x轴范围
plt.ylim((-1,1)) #确定y轴范围
plt.xticks([0,np.pi/2,np.pi,np.pi*1.5,np.pi*2]) #确定x轴刻度
plt.yticks([-1,-0.5,0,0.5,1]) #确定y轴刻度
plt.plot(rad,np.sin(rad)) #添加sin曲线
plt.plot(rad,np.cos(rad)) #添加cos曲线
plt.legend(['sin','cos'])
plt.savefig('sincos.png')
plt.show()
以下为运行结果
设置pyplot的动态rc参数
pyplot使用rc配置文件来自定义图形的各种默认属性,被称为rc配置或rc参数。
默认rc参数可以在Python交互环境中动态更改。所有存储在字典变量中的rc参数,都被称为rcParams。
原图
#原图
x = np.linspace(0, 4*np.pi) #生成x轴数据
y = np.sin(x) #生成y轴数据
plt.plot(x,y,label="$sin(x)$") #绘制sin曲线图
plt.title('sin')
plt.savefig('sin.png')
plt.show()
修改rc参数后的图
#修改rc参数后的图
x = np.linspace(0, 4*np.pi) #生成x轴数据
y = np.sin(x) #生成y轴数据
#修改rc参数
plt.rcParams['lines.linestyle'] = '-.' #将线条设置为点划线
plt.rcParams['lines.linewidth'] = 3 #设置线条宽度
plt.rcParams['font.sans-serif'] = 'SimHei' #设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False #设置正常显示符号,显示中文
#默认的pyplot字体并不支持中文字符的显示
plt.plot(x,y,label="$sin(x)$") #绘制sin曲线图
plt.title('sin曲线')
plt.savefig('sin.png')
plt.show()
线条常用的rc参数名称
rc参数名称 | 解释 | 取值 |
---|---|---|
lines.linewidth | 线条宽度 | 取0~10之间的数值,默认为1.5 |
lines.linestyle | 线条样式 | 实线: ‘-’ , 长虚线 ‘–’,点划线 ‘-.’,短虚线 ‘:’ |
lines.marker | 线条上点的形状 | 参照下表,默认为None |
lines.markersize | 点的大小 | 取0~10之间的数值,默认为1 |
line.marker参数取值及意义
lines.marker取值 | 意义 | lines.marker取值 | 意义 |
---|---|---|---|
’ o ’ | 圆圈 | ’ . ’ | 点 |
’ D ’ | 菱形 | ’ s ’ | 正方形 |
’ h ’ | 六边形1 | ’ * ’ | 星号 |
’ H ’ | 六边形2 | ’ d ’ | 小菱形 |
’ - ’ | 水平线 | ’ v ’ | 一角朝下的三角形 |
’ 8 ’ | 八边形 | ’ < ’ | 一角朝左的三角形 |
’ p ’ | 五边形 | ’ > ’ | 一角朝右的三角形 |
’ , ’ | 像素 | ’ ^ ’ | 一角朝上的三角形 |
’ + ’ | 加号 | ’ \ ’ | 竖线 |
’ None ’ | 无 | ’ x ’ | X |
分析特征间的关系
散点图主要用于分析特征间的相关关系
折线图则用于分析自变量特征和因变量特征之间的趋势关系
绘制散点图
散点图是以一个特征为横坐标,以另一个特征为纵坐标,利用坐标点(散点)的分布形态反应特征间的统计关系的一种图形。
散点图可以提供两类关键信息:
(1)特征之间是否存在数值或者数量的关联趋势,关联趋势是线性的还是非线性的。
(2)如果某个点或者某几个点偏离大多数点,则这些点就是离群值,通过散点图可以一目了然,从而可以进一步分析这些离群值是否在建模分析中产生很大的影响。
pyplot中绘制散点图的函数为scatter,语法如下:
matplotlib.pyplot.scatter(x, y, s=None, c=None,
marker=None, cmap=None, norm=None, vmin=None, Vmax=None,
alpha=None, linewidths=None, verts=None, edgecolors=None,
hold=None,**kwargs)
参数名称 | 说明 |
---|---|
x,y | 接收x轴和y轴对应的数据。无默认 |
s | 接收数值或者一维的array。指定点的大小,若传入一维array,则表示每个点的大小。默认为None |
c | 接收颜色或者一维的array。指定点的颜色,若传入一维array,则表示每个点的颜色。默认为None。 颜色还可以设置为一个元组(a,b,c),其中a,b,c为三个0~1之间的数值,表示红色、绿色和蓝色分量。 |
cmap | 颜色映射,在参数c接收一个array时,可以设定一个颜色,根据array中数值的大小来显示颜色的深浅。例:c=y, cmap=plt.cm.Blues。 详细的颜色映射可参考链接 |
marker | 接收特定的string。表示绘制的点的类型。默认为None |
alpha | 接收0~1的小数。表示点的透明度。默认为None |
edgecolor | 表示点的轮廓。‘none’ 表示删除点的轮廓 |
绘制折线图
折线图是一种将数据点按照顺序连接起来的图形。折线图的主要功能是查看因变量y随着自变量x改变的趋势,最适合用于显示随时间而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化。
基本语法:
matplotlib.pyplot.plot(*args, **kwargs)
plot函数在官方文档的语法中只要输入不定长参数,实际可以输入的参数主要如下表所示。
参数名称 | 说明 |
---|---|
x,y | 接收array。表示x轴和y轴对应的数据。无默认 |
color | 接收特定的string。指定线条的颜色。默认为None |
linestyle | 接收特定string。指定线条类型。线条类型同rc参数。默认为 ‘-’ |
marker | 接收特定string。表示绘制的点的类型。点的类型同rc参数。默认为None |
alpha | 接收0~1的小数。表示点的透明度。默认为None |
color参数常用颜色
颜色缩写 | 代表的颜色 | 颜色缩写 | 代表的颜色 |
---|---|---|---|
’ b ’ | 蓝色 | ’ m ’ | 品红 |
’ g ’ | 绿色 | ’ y ’ | 黄色 |
’ r ’ | 红色 | ’ k ’ | 黑色 |
’ c ’ | 青色 | ’ w ’ | 白色 |
分析特征内部数据分布与分散情况
直方图
直方图又称质量分布图。用直方图可以比较直观的看出产品质量特性的分布状态,便于判断其总体质量分布情况。
基本使用语法如下。
matplotlib.pyplot.bar(left, height, width = 0.8, bottom = None,
hold = None, data = None, **kwargs)
参数名称 | 说明 |
---|---|
left | 接收array。表示x轴的数据。无默认 |
height | 接收array。表示x轴所代表数据的数列。无默认 |
width | 接收0~1之间的float。指定直方图宽度。默认为0.8 |
color | 接收特定string或者包含颜色的字符串的array。表示直方图的颜色。默认为None |
事例如下
import matplotlib.pyplot as plt
import csv
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体
plt.rcParams['axes.unicode_minus'] = False # 设置中文显示
# 提取数据
filename = '年度数据.csv' # 本地数据文件名
with open(filename) as f: # 打开本地数据文件
reader = csv.reader(f) # 读取文件内容
# 提取文件中的数据转化为列表
for index,row in enumerate(reader):
if index == 2:
years = row[1:]
years.reverse() # 数据倒序排列
elif index == 3:
values = row[1:]
int_values = [float(i) for i in values] # 将str数据转化为float数据
int_values.reverse() # 数据倒序排列
# 绘制直方图
plt.figure(figsize=(7,6)) # 设置画布大小
plt.bar(years, int_values, width = 0.5, color = 'g') #创建直方图
plt.xlabel('年份') # x轴名称
plt.ylabel('国民总收入(亿元)') # y轴名称
plt.ylim((400000,1000000)) # 设置y轴数据范围
plt.xticks(years, rotation=45) # 设置x轴刻度
plt.yticks([i for i in range(400000,1000000,100000)]) # 设置y轴刻度
plt.title('2010~2019国民总收入历年比较') # 总标题
plt.savefig('国民总收入直方图.png') # 保存文件
plt.show()
绘制后的直方图
饼图
饼图可以比较清楚的反应出部分与部分、部分与整体之间的比例关系,易于显示每组数据相对于总数的大小,而且显示方式直观。
基本语法如下:
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None,
autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=None, radius=None, counterclock=True, wedgeprops=None,
textprops=None, center=(0,0), frame=False, hold=None, data=None)
参数名称 | 说明 |
---|---|
x | 接收array。表示用于绘制饼图的数据。无默认 |
explode | 接收array。表示指定项距离饼图圆心为n个半径。默认为None |
labels | 接收array。指定每一项的名称。默认为None |
color | 接收特定string或者包含颜色字符串的array。表示饼图颜色。默认为None |
autopct | 接收特定string。指定数值的显示方式。例如’%.1f%%'表示百分比格式,保留小数点一位。默认为None |
pctdistance | 接收float。指定每一项的比例autopct和距离圆心的半径。默认为0.6 |
labeldistance | 接收float。指定每一项的名称labels和距离圆心的半径。默认为1.1 |
radius | 表示饼图的半径。默认为1 |
startangle | 表示饼图的起始角度 |
counterclock | 是否逆时针,默认为True |
wedgeprops | {‘linewidth’: 1.5, ‘edgecolor’:‘green’},设置饼图内外边界的属性值 |
textprops | {‘fontsize’:12, ‘color’:‘k’}, 设置文本标签的属性值 |
center | 设置饼图的原点 |
shadow | 在饼图下设置阴影。默认为False |
事例如下
import csv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
filename = '年度数据.csv'
with open(filename) as f:
reader = csv.reader(f)
values = [row[1] for row in reader]
float_values = [float(i) for i in values[5:8]] # 将str数据转化为float数据
label = ['第一产业', '第二产业', '第三产业']
# 绘制饼图
plt.figure(figsize=(6,6))
explode = [0.01, 0.01, 0.01]
plt.pie(float_values, explode=explode, labels=label, autopct='%1.1f%%')
plt.title('2019年各产业增加值')
plt.savefig('2019年各产业增加值')
plt.show()
绘制后的饼图
箱线图
箱线图也称箱须图,其绘制需使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异。
基本语法如下:
matlotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None,
widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None,
meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None,
labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None,
whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, hold=None, data=None)
boxplot函数常用参数及说明
参数名称 | 说明 |
---|---|
x | 接收array。表示用于绘制箱线图的数据。无默认 |
notch | 接收boolean。表示中间箱体是否有缺口。默认为None |
sym | 接收string。指定异常点形状。默认为None |
vert | 接收boolean。表示图形是纵向或者横向。默认为None |
positions | 接收array。表示图形位置。默认为None |
widths | 接收scalar或者array。表示每个箱体的宽度。默认为None |
labels | 接收array。指定每一个箱线图的标签。默认为None |
meanline | 接收boolean。表示是否显示均值线。默认为None |
事例如下
import csv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
filename = '年度数据.csv'
with open(filename) as f:
reader = csv.reader(f)
for index, row in enumerate(reader):
if index == 5:
value_1 = [float(i) for i in row[1:]]
elif index == 6:
value_2 = [float(i) for i in row[1:]]
elif index == 7:
value_3 = [float(i) for i in row[1:]]
else:
continue
label = ['第一产业', '第二产业', '第三产业']
values = (value_1, value_2, value_3)
plt.figure(figsize=(6,4))
plt.boxplot(values, labels=label, meanline=True)
plt.title('2010~2018年各产业生产总值')
plt.savefig('E://Python/2010~2018年各产业生产总值.png')
plt.show()
绘制后的箱线图