文章目录
- 通过figure()函数创建画布
- 通过subplot()函数创建单个子图
- 通过subplots()函数创建多个子图
- 通过add_subplot()方法添加和选中子图
- 添加各类标签
- 绘制常见图表
- 绘制直方图——hist()函数
- 绘制散点图——scatter()函数
- 绘制柱状图——bar()函数
- 设定线条的相关参数
- 本地保存图片
通过figure()函数创建画布
在pyolot模块中,默认拥有一个Figure对象,该对象可以理解为一张空白的画布,用于容纳图标的各种组件,比如图例、坐标轴等。
figure(num=None, # autoincrement if None, else integer from 1-N
figsize=None, # defaults to rc figure.figsize
dpi=None, # defaults to rc figure.dpi
facecolor=None, # defaults to rc figure.facecolor
edgecolor=None, # defaults to rc figure.edgecolor
frameon=True,
FigureClass=Figure,
clear=False,
**kwargs
)
部分参数表示的含义如下:
- num:表示图形的编号或名称,数字代表编号,字符串表示名称。如果没有提供该参数,则会创建一个新的图形,并且这个图形的编号会增加;如果提供该参数,并且具有此id的图形已经存在,则会将其激活并返回对其的引用,若此图形不存在,则会创建并返回它。
- figsize:用于设置画布的尺寸,宽度、高度以英寸为单位。
- dpi:设置图形的分辨率。
- facecolor:用于设置画板的背景颜色。
- edgecolor:用于显示边框原色。
- frameon:表示是否显示边框。
- FigureClass:派生自matplotlib.figure.Figure的类,可以选择使用自定义的图形对象。
- clear:若设为True且该图形已经存在,则它会被清除。
创建新的画布并返回Figure实例
figure_obj = plt.figure()
print(type(figure_obj))
输出结果:
<class 'matplotlib.figure.Figure'>
用type()查看figure_obj对象的类型,可以看出其是一个Figure类的对象。
创建的新画布:
尝试另创建一个背景颜色为灰色的新画布,并在画布上绘制一张折线图:
import matplotlib.pyplot as plt
import numpy as npdata = np.arange(100, 201)
plt.figure(facecolor='gray')
plt.plot(data)
plt.show()
输出结果:
从输出结果可以看出x轴的刻度范围为0~100,y轴的刻度范围为指定的数值区间。这是因为在调用plot()函数时,如果传入了单个列表或数组,则会将其设为y轴序列,且自动生成x轴的序列。x轴的序列从0开始,与y轴序列具有相同的长度。
通过subplot()函数创建单个子图
在同一个画布上绘制多个图形,Figure对象允许划分为多个绘图区域,每个绘图区域都是一个Axes对象,它拥有属于自己的坐标系统,被称为子图。
subplot(nrows, ncols, index, **kwargs)
参数表示的含义如下:
- nrows,ncols:表示子区网格的行数、列数。
- index:表示矩阵区域的索引。
subplot()函数会将整个绘图区域等分为“nrows(行)× ncols(列)”的矩阵区域,之后按照从左到右、从上到下的顺序对每个区域进行编号。从一开始依次递增。
如果nrows, ncols, index这三个参数的值都小于10,则可以把它们简写为一个实数,如subplot(2,2,3)可以写成subplot(223)。
创建单个子图并在其上绘制简单的图形:
data = np.arange(100, 201)
plt.subplot(221)
plt.plot(data, data)
plt.subplot(2, 2, 2)
plt.plot(data, -data)
plt.subplot(212)
plt.plot(data, data*2)
plt.show()
输出结果:
通过subplot()函数可以规划Figure对象划分为多少个字图,但每调用一次该函数只会创建单个子图。
通过subplots()函数创建多个子图
如果希望一次性创建一组子图,则可以通过subplots()函数进行实现。
subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True,
subplot_kw=None, gridspec_kw=None, **fig_kw):
上述函数常用的参数含义如下:
- nrows,ncols:表示子区网格的行数、列数,默认为1。
- sharex,sharey:表示控制x或y轴是否共享。若设为“True”或“all”,则表示x或y轴在所有的子图中共享;若设为“False”或“None”,则每个子图的x或y轴是独立的;若设为“row”,则每个子图沿行方向共享x轴或y轴;若设为“col”,则每个子图沿列方向共享x轴或y轴。
subplots()函数会返回一个元组,元组的第一个元素为Figure对象(画布),第二个元素为Axes对象(子图,包含坐标轴和画的图)或Axes对象数。如果创建的是单个子图,则返回的是一个Axes对象,否则返回的是一个Axes对象数组。
创建4个子图,并在每个子图上绘制一些简单的图形:
# 生成包括100~200之间所有整数的数组
data = np.arange(100, 201)# 分成2*2的矩阵区域,返回子图数组axes
fig, axes = plt.subplots(2, 2)
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
# 再选中的子图上作图
ax1.plot(data, data)
ax2.plot(data, -data)
ax3.plot(data, data**2)
ax4.plot(data, np.log(data))
plt.show()
输出结果:
通过add_subplot()方法添加和选中子图
想要创建子图,除了使用pyplot模块的函数之外, 还可以通过Figure类的add_subplot()方法添加和选中子图。
add_subplot(self, *args, **kwargs)
上述方法中,*args参数表示一个三位数的实数或三个独立的实数,用于描述子图的位置。(具体用法类似于subplot()函数中的nrows, ncols, index参数。)
注意: 每调用一次add_subplot()方法会规划画布划分子图,但只会添加一个子图。当调用plot()函数绘制图形时,会画在最后一次指定子图的位置上。
创建具有两行两列的矩阵区域,且在编号为2的子图上绘制图形:
# 通过add_subplot()方法添加和选中子图
fig = plt.figure()
# 添加子图
fig.add_subplot(2, 2, 1)
fig.add_subplot(2, 2, 4)
fig.add_subplot(223)
fig.add_subplot(2, 2, 2)
# 在子图上作图,randn函数返回一个或一组样本,具有标准正态分布。
random_arr = np.random.randn(100)
# 默认是在最后一次使用subplot的位置上作图,即编号为3的位置
plt.plot(random_arr)
plt.show()
输出结果:
上述示例中,首先创建了Figure类对象fig,然后调用add_subplot()方法将fig对象化分为一个2行2列的矩阵区域,且将图形绘制在最后选中的编号为2的子区域上,调用plot()函数根据创建的随机数组绘制折线图。
添加各类标签
图表添加标签和图例的常用函数
函 数 名 称 | 说 明 |
---|---|
title() | 设置当前轴的标题 |
xlabel() | 设置当前图形x轴的标签名称 |
ylabel() | 设置当前图形y轴的标签名称 |
xticks() | 指定x轴刻度的数目与取值 |
yticks() | 指定y轴刻度的数目与取值 |
xlim() | 设置或获取当前图形x轴的范围 |
ylim() | 设置或获取当前图形y轴的范围 |
legend() | 在轴上放置一个图例 |
表中的函数之间是并列关系,没有先后顺序,既可以先绘制图形,也可以先添加标签。当然,添加图例只能在绘制完成之后。
在使用Matplotlib绘图时,如果要设置的图标标题中有中文字符,则会变成方格子而无法正确显示。
实际上Matplotlib是支持中文编码的,出现这种情况主要是因为Matplotlib库的配置信息里面没有中文字体的相关信息,这是可以采用以下方式进行解决:
在python脚本中动态设置matplotlib,这样就可以避免由于更改配置文件而造成的麻烦。
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文字体
另外,由于字体更改以后会导致坐标轴中部分字符无法正常显示,这是需要更改axes.unicode_minus参数。
mpl.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
代码实现:
# 添加各类标签
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文字体
mpl.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
data1 = np.arange(0, 1.8, 0.1)
plt.title("陈丑丑的身高体重数据") # 添加标题
plt.xlabel("length") # x轴名称
plt.ylabel("weight") # y轴名称
plt.xticks(np.arange(0, 1.8, step=0.1))
plt.yticks(np.arange(0, 66, step=4))
plt.plot(data1, (data1**2)*20) # 绘制y=(x^2)*20曲线
plt.legend(["y=(x^2)*20"]) # 添加图例
plt.show()
输出结果:
绘制常见图表
绘制直方图——hist()函数
hist(
x, bins=None, range=None, density=False, weights=None,
cumulative=False, bottom=None, histtype=‘bar’, align=‘mid’,
orientation=‘vertical’, rwidth=None, log=False, color=None,
label=None, stacked=False, *, data=None, **kwargs)
上述函数中常用参数表示的含义如下:
- x:表示输入值,可以是单个数组,或者是不需要相同长度的数组序列。
- bins:表示绘制条柱的个数,默认为10。
- range:bins的上下范围(最大和最小值)。
- color:表示条柱的颜色,默认为None。
代码实现:
arr_random = np.random.randn(100)
plt.hist(arr_random, bins=8, color='m', alpha=0.5) # alpha用于设置颜色深度——透明度
plt.show()
输出结果:
上述示例中,首先创建了一个包含100个随机数的数组,用来表示绘制图形使用的数据,接着调用hist()函数绘制一个直方图,这个直方图共有8个条柱,每个条柱的颜色为品红,透明度alpha为0.5。
绘制散点图——scatter()函数
scatter(
x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None,
verts=cbook.deprecation._deprecated_parameter,
edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
上述函数中常用参数表示的含义如下:
- x,y:表示x轴和y轴对应的数据。
- s:指定散点的大小。若传入的是一维数组,则表示每个点的大小。
- c:指定散点的颜色。若传入的是一维数组,则表示每个点的颜色。
- marker:表示绘制的散点类型。
- alpha:表示点的透明度,取值0~1之间。
代码实现:
# 绘制散点图
x = np.arange(21)
y = np.random.rand(21)*10
plt.scatter(x, y, c='g', marker='*')
plt.show()
输出结果:
上述示例中,首先创建了一个包含整数0 ~ 20的数组,这些数值将作为散点图中x轴对应的数据。其次创建了含有21个0 ~ 1之间的随机数的数组,将它们乘以10的结果作为y轴对应的数据。散点的类型为星形。【关于线条的相关参数设置在本篇篇尾】
绘制柱状图——bar()函数
bar(
x, height, width=0.8, bottom=None, *, align=‘center’,
data=None, **kwargs)
上述函数中常用参数表示的含义如下:
- x:表示x轴的数据。
- height:表示条形的高度。
- width:表示条形的宽度,默认为0.8。
- color:表示条形的颜色。
- edgecolor:表示条形边框的颜色。
代码实现:
# 绘制柱状图
x1 = np.arange(5)
# 从上下限范围内随机选取整数,创建两个2行5列的数组
y1, y2 = np.random.randint(1, 91, size=(2, 5))
ax = plt.subplot(222) # 创建一个子图
width = 0.25 # 条形的宽度
ax.bar(x1, y1, width=width, color='r') # 绘制红色的柱形图
ax.bar(x1+width, y2, width=width, color='g') # 绘制另一个绿色的柱形图
ax.set_xticks(x1+0.1) # 设置x轴的刻度
ax.set_xticklabels(['a', 'b', 'c', 'd', 'e']) # 设置x轴的标签
plt.show()
输出结果:
上述示例中,首先创建了包含整数0 ~ 4的数组,将其作为x轴的数据;接着又创建了两个2行5列的二维数组,它们的数据是从1 ~ 30内随机选取的整数,然后再指定编号为2的子图上,调用bar()函数绘制了两个柱形图。第一个柱形图x,y轴的数据设为x1、y1,颜色为红色。第二个柱形图x,y轴使用的数据为x+width和y2,颜色为绿色,最后设置了x轴的刻度标签为“a、b、c、d、e”。
设定线条的相关参数
线条颜色使用color参数控制
颜 色 值 | 说 明 |
---|---|
b(blue) | 蓝色 |
g(green) | 绿色 |
r(red) | 红色 |
c(cyan) | 青色 |
m(magenta) | 品红 |
y(yellow) | 黄色 |
k(black) | 黑色 |
w(white) | 白色 |
标记风格使用marker参数控制
标记风格值 | 说 明 |
---|---|
o | 实心圆圈 |
D | 菱形 |
h | 六边形1 |
H | 六边形2 |
8 | 八边形 |
p | 五边形 |
+ | 加号 |
. | 点 |
s | 正方形 |
* | 星形 |
v | 倒三角形 |
^ | 正三角形 |
> | 一角朝右的三角形 |
< | 一角朝左的三角形 |
线型使用linestyle参数控制
线型值 | 说明 |
---|---|
- | 实线 |
– | 长虚线 |
-. | 短点相间线 |
: | 短虚线 |
代码示例:
data2 = np.arange(1, 3, 0.3)
plt.plot(data2, marker="x", linestyle='--')
plt.plot(data2+1, marker='o', linestyle=':')
plt.plot(data2+2, color='k', marker='s', linestyle='-.')
输出结果:
代码示例:
# 等价于
plt.plot(data2, 'x--', data2+1, 'o:', data2+2, 'ks-.')
输出结果:
本地保存图片
想要保存当前生成的图表,可以调用savefig()函数进行保存。
savefig(*args, **kwargs)
上述函数中,有fname参数——一个包含文件名路径的字符串,或者是一个类似于Python文件的对象。
如果format参数设为None且fname参数是一个字符串,则输出格式将根据文件名的扩展名推导出来。
使用savefig()函数将图片保存在指定的目录下,具体代码实现如下(在show()函数钱插入):
data2 = np.arange(1, 3, 0.3)
plt.plot(data2, marker="x", linestyle='--')
plt.plot(data2+1, marker='o', linestyle=':')
plt.plot(data2+2, color='k', marker='s', linestyle='-.')
# 等价于
plt.plot(data2, 'x--', data2+1, 'o:', data2+2, 'ks-.')# 本地保存图片
plt.savefig(r"D:\数据分析\demo.png")
plt.show()
print("over!")
输出结果:
在操作完成后使用print(“over!”)输出上图结果作为执行结束提示。
可以从相应路径中打开文件以检查是否成功保存。