Matplotlib库学习
2.1 Matplotlib库小测
2.2 Pyplot的绘图区域
plt.subplot(nrows, ncols, plot_number)
- 图表的整个绘图区域被分成
numRows
行和numCols
列- 然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1
plotNum
参数指定创建的Axes
对象所在的区域以plt.subplot(3,2,4)或者plt.subplot(324)为例:
案例:
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2 * np.pi * t)
a = np.arange(0.0, 5.0, 0.02)
plt.subplot(211)
plt.plot(a, f(a))
plt.subplot(212)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()
2.3 Pyplot的plot函数
plt.plot(x,y,format_string,**kwargs)
- x:X轴数据,列表或数组,可选。
- y:Y轴数据,列表或数组
- format_string:控制曲线的格式字符串,可选。由颜色字符、风格字符和标记字符组成
颜色字符:
风格字符:
标记字符:
- **kwargs:第二组或更多(x,y,format_string)
color:控制颜色,color = 'green'
linestyle:线条风格,linestyle = 'dashed'
marker:标记风格,marker = 'o'
markerfacecolor:标记颜色,markerfacecolor = 'blue'
markersize:标记尺寸,markersize = 20
例一:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a * 1.5, 'go-', a, a * 2.5, 'rx', a, a * 3.5, '*', a, a * 4.5, 'b-.')
plt.show()
例二:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a * 1.5, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize=5)
plt.show()
2.4 Pyplot的中文显示
方法一
pyplot并不默认支持中文显示,需要rcParams修改字体实现
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
plt.plot([3, 1, 4, 5, 2])
plt.ylabel('纵轴(值)')
plt.savefig('test1',dpi=600)
plt.show()
- Rcparams的属性
- 关于中文字体的种类(rcParams['font.family'])
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 15
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()
方法二
在有中文输出的地方,增加一个属性:fontproperties
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15)
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.plot(a, np.cos(2 * np.pi * a), 'b--')
plt.show()
2.5 Pyplot的文本显示函数
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -2, 2]) # x轴和y轴的范围
plt.grid(True) # 显示网格线
plt.show()
plt.annotate()函数用于标注文字
参数:
-
s 为注释文本内容
-
xy 为被注释的坐标点
-
xytext 为注释文字的坐标位置
-
xycoords 参数如下:
- figure points:图左下角的点
- figure pixels:图左下角的像素
- figure fraction:图的左下部分
- axes points:坐标轴左下角的点
- axes pixels:坐标轴左下角的像素
- axes fraction:左下轴的分数
- data:使用被注释对象的坐标系统(默认)
- polar(theta,r):if not native ‘data’ coordinates t
-
weight 设置字体线型
- {‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’}
-
color 设置字体颜色
- {‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’}
- ‘black’,'red’等
- [0,1]之间的浮点型数据
- RGB或者RGBA, 如: (0.1, 0.2, 0.5)、(0.1, 0.2, 0.5, 0.3)等
-
arrowprops #箭头参数,参数类型为字典dict
- width:箭头的宽度(以点为单位)
- headwidth:箭头底部以点为单位的宽度
- headlength:箭头的长度(以点为单位)
- shrink:总长度的一部分,从两端“收缩”,两端留白
- facecolor:箭头颜色
-
bbox给标题增加外框 ,常用参数如下:
- boxstyle:方框外形
- facecolor:(简写fc)背景颜色
- edgecolor:(简写ec)边框线条颜色
- edgewidth:边框线条大小
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
# 标题
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
# 注释
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2]) # x轴和y轴的范围
plt.grid(True) # 显示网格线
plt.show()
2.6 Pyplot基础图表函数
2.7 MyPlot饼图的绘制
方法:plt.pie()
参数:
参数 | 意义 |
---|---|
x | 浮点型数组,表示每个扇形的面积。 |
explode | 数组,表示各个扇形之间的间隔,默认值为0。 |
labels | 列表,各个扇形的标签,默认值为 None。 |
colors | 数组,表示各个扇形的颜色,默认值为 None。 |
autopct | 设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。 |
labeldistance | 标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。 |
pctdistance | 类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。 |
shadow | 布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。 |
radius | 设置饼图的半径,默认为 1。 |
startangle | 起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。 |
counterclock | 布尔值,设置指针方向,默认为 True,即逆时针,False 为顺时针。 |
wedgeprops | 字典类型,默认值 None。参数字典传递给 wedge 对象用来画一个饼图。例如:wedgeprops={'linewidth':5} 设置 wedge 线宽为5 |
textprops | 字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。 |
center | 浮点类型的列表,默认值:(0,0)。用于设置图标中心位置。 |
frame | 布尔类型,默认值:False。如果是 True,绘制带有表的轴框架。 |
rotatelabels | 布尔类型,默认为 False。如果为 True,旋转每个 label 到指定的角度。 |
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
# sizes 是数据,labels 是标签,radius 是饼图半径
# explodes 为0代表不偏离圆心,不为零则代表偏离圆心的距离
plt.pie(sizes, explode=explode, labels=labels, radius=0.8,
autopct='%1.1f%%', shadow=True, startangle=90,
textprops={'fontsize': 15, 'color': 'black'}) # 标签和文本的格式
plt.axis('equal') # 正圆
# 创建图例
# borderaxespad允许您设置锚点与loc指定的框架部分之间的距离
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05), fontsize=10, borderaxespad=0.3)
plt.show()
2.8 Pyplot直方图的绘制
-
直方图:将统计值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。
-
直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个类别的占比,其高度总和等于1。
import matplotlib.pyplot as plt
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
参数 | 含义 |
---|---|
x | 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数 |
bins | 直方图的柱数,即要分的组数,默认为10 |
range | 元组(tuple)或None;剔除较大和较小的离群值,给出全局范围;如果为None,则默认为(x.min(), x.max());即x轴的范围; |
density | 布尔值。如果为true,则返回的元组的第一个参数n将为频率而非默认的频数; |
weights | 与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图 |
cumulative | 布尔值;如果为True,则计算累计频数;如果normed或density取值为True,则计算累计频率 |
bottom | 数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离 |
histtype | {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起 |
align | {‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘 |
orientation | {‘horizontal’, ‘vertical’}:如果取值为horizontal,则条形图将以y轴为基线,水平排列;简单理解为类似bar()转换成barh(),旋转90° |
rwidth | 标量值或None。柱子的宽度占bins宽的比例 |
log | 布尔值。如果取值为True,则坐标轴的刻度为对数刻度;如果log为True且x是一维数组,则计数为0的取值将被剔除,仅返回非空的(frequency, bins, patches) |
color | 具体颜色,数组(元素为颜色)或None |
label | 字符串(序列)或None;有多个数据集时,用label参数做标注区分 |
stacked | 布尔值。如果取值为True,则输出的图为多个数据集堆叠累计的结果;如果取值为False且histtype=‘bar’或’step’,则多个数据集的柱子并排排列 |
normed | 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数 |
edgecolor | 直方图边框颜色 |
alpha | 透明度 |
返回值(用参数接收返回值,便于设置数据标签):
- n:直方图向量,即每个分组下的统计值,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数);
- bins: 返回各个bin的区间范围;
- patches:返回每个bin里面包含的数据,是一个list。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
mu, sigma = 100, 20 # 均值和标准差
a = np.random.normal(mu, sigma, size=100)
plt.hist(a, bins=30, density=True, align='mid', histtype='stepfilled', color='g', edgecolor='black', alpha=0.75)
plt.title('Histogram')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# figsize:指定figure的宽和高,单位为英寸
# dpi参数指定绘图对象的分辨率
plt.figure(figsize=(10,8), dpi=80)
np.random.seed(0)
mu, sigma = 100, 20 # 均值和标准差
a = np.random.normal(mu, sigma, size=100)
n, bins, patches = plt.hist(a, bins=20, density=False, align='left', rwidth=0.8, color='g', edgecolor='black',
alpha=0.75,label='正态函数直方图')
for i in range(len(n)):
plt.text(bins[i], n[i] * 1.02, int(n[i]), fontsize=12, horizontalalignment='center')
plt.title('Histogram')
plt.show()
2.9 Pyplot极坐标的绘制
1.引入两个方法:
方法一: array = numpy.linspace(start, end, num=num_points)
将在start
和end
之间生成一个统一的序列,共有num_points
个元素。
参数:
- start 范围的起点(包括)
- end 范围的端点(包括)
- num 序列中的总点数
- endpoint 不在序列计算中包括最后一点
方法二:可通过plt.cm直接调用已在matplotlib中定制好的色板。
2.极轴图 - 极坐标的柱状图
import numpy as np
import matplotlib.pyplot as plt
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
# 面向对象绘制极坐标
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
# 设置颜色,virdis的地方可以写其他的colormap
bar.set_facecolor(plt.cm.viridis(r / 10.))
bar.set_alpha(0.5)
plt.show()
3.雷达图绘制
import numpy as np
import matplotlib.pyplot as plt
ax1 = plt.subplot(111, projection='polar')
ax1.set_title('Radar Map')
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
data1 = 10 * np.random.rand(N)
data2 = 10 * np.random.rand(N)
data3 = 10 * np.random.rand(N)
ax1.plot(theta, data1, '.--', label='data1')
ax1.fill(theta,data1,alpha=0.2)
ax1.plot(theta, data2, '.--', label='data2')
ax1.fill(theta,data2,alpha=0.2)
ax1.plot(theta, data3, '.--', label='data3')
ax1.fill(theta,data3,alpha=0.2)
# 绘制雷达线
plt.show()
2.10 Pyplot散点图的绘制
面向matlab库的方法
import matplotlib.pyplot as plt
import numpy as np
# 定义数据
x = np.random.rand(10) # 取出10个随机数
y = x + x ** 2 - 10 # 用自定义关系确定y的值
# 绘图
# 1. 确定画布
plt.figure(figsize=(8, 4)) # figsize:确定画布大小
# 2. 绘图
plt.scatter(x, # 横坐标
y, # 纵坐标
c='red', # 点的颜色
label='function') # 标签 即为点代表的意思
# 3.展示图形
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.15), fontsize=10) # 显示图例
plt.show()
面向对象的方法
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = 10 * np.random.randn(100)
y = 10 * np.random.randn(100)
# ax.plot(x, y, 'o')
ax.scatter(x, y)
ax.set_title('Simple Scatter')
plt.show()
2.11 面向对象绘图
具体看这一篇文章:(78条消息) python可视化(3-1)面向对象绘图(画布和子图,fig & ax)_遥远的小宇的博客-CSDN博客
对象 | 常用代号 |
---|---|
画布 | fig |
子图(或者坐标系) | ax |
绘图对象(如散点,直方、折线等) | ax.scatter、ax.hist、ax.plot |
坐标轴 | ax.xaxis |
坐标轴刻度 | ax.xaxis.xtick |
图例 | ax.legend |
轴标题 | ax.xlabel |
思路一:创建画布,在画布基础上创建子图
刚思路需先创建一个画布对象fig,并以此为基础,通过调用fig.add_subplot接口或fig.add_axes接口,逐个创建子图ax,后通过ax进行绘图对象的绘制及子图的修改。两者原理亦有些差别。
思路二:画布和子图同时创建(推荐)
在画布(fig)上一个个地add(add_subplot,add_axes)子图,往往效率不高,plt.subplots接口很好地解决了该问题,一步生成画布,并同时生成m行,n列的子图栅格。
案例一:在一张画布上,左边画一个折线图,右边画一个散点图
import matplotlib.pyplot as plt
# 生成画布和axes对象
# nrow1=1和ncols=2分别代表1行和两列
fig, ax = plt.subplots(nrows=1, ncols=2)
ax[0].plot([1, 2, 3], [4, 5, 6])
ax[1].scatter([1, 2, 3], [4, 5, 6])
plt.show()
思路三:创建画布栅格
1.不均匀的栅格子图
一种创建栅格的方式,是在画布的基础上,增加一个栅格对象GridSpec
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
# plt.figure()是新建一个画布。如果有多个图依次可视化的时候,需要使用
plt.figure()
# 划分为九个格子
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :2])
ax3 = plt.subplot(gs[1:, 2])
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])
ax1.text(0.5, 0.5, r'ax1', fontsize=15)
ax2.text(0.5, 0.5, r'ax2', fontsize=15)
ax3.text(0.5, 0.5, r'ax3', fontsize=15)
ax4.text(0.5, 0.5, r'ax4', fontsize=15)
ax5.text(0.5, 0.5, r'ax5', fontsize=15)
plt.show()
2.栅格子图的合并-plt.subplot2grid
理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始
plt.subplot2grid(GridSpec.CurSpec,colspan=1,rowspan=1)
* GridSpec:网格划分
* CurSpec:网格选中
* colspan:列方向上的跨度
* rowspan:行方向上的跨度
例一:
ax1区域:plt.subplot((3,3),(0,0),colspan=3)
...
ax2区域:plt.subplot((3,3),(1,0),colspan=2)
...
ax3区域:plt.subplot((3,3),(1,2),rowspan=2)
...
ax4区域:plt.subplot((3,3),(2,0))
...
ax5区域:plt.subplot((3,3),(2,1))