Matplotlib——绘制图表


通过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
)

部分参数表示的含义如下:

  1. num:表示图形的编号或名称,数字代表编号,字符串表示名称。如果没有提供该参数,则会创建一个新的图形,并且这个图形的编号会增加;如果提供该参数,并且具有此id的图形已经存在,则会将其激活并返回对其的引用,若此图形不存在,则会创建并返回它。
  2. figsize:用于设置画布的尺寸,宽度、高度以英寸为单位。
  3. dpi:设置图形的分辨率。
  4. facecolor:用于设置画板的背景颜色。
  5. edgecolor:用于显示边框原色。
  6. frameon:表示是否显示边框。
  7. FigureClass:派生自matplotlib.figure.Figure的类,可以选择使用自定义的图形对象。
  8. 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 np

data = 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)

参数表示的含义如下:

  1. nrows,ncols:表示子区网格的行数、列数。
  2. 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):

上述函数常用的参数含义如下:

  1. nrows,ncols:表示子区网格的行数、列数,默认为1。
  2. 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)

上述函数中常用参数表示的含义如下:

  1. x:表示输入值,可以是单个数组,或者是不需要相同长度的数组序列。
  2. bins:表示绘制条柱的个数,默认为10。
  3. range:bins的上下范围(最大和最小值)。
  4. 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)

上述函数中常用参数表示的含义如下:

  1. x,y:表示x轴和y轴对应的数据。
  2. s:指定散点的大小。若传入的是一维数组,则表示每个点的大小。
  3. c:指定散点的颜色。若传入的是一维数组,则表示每个点的颜色。
  4. marker:表示绘制的散点类型。
  5. 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)

上述函数中常用参数表示的含义如下:

  1. x:表示x轴的数据。
  2. height:表示条形的高度。
  3. width:表示条形的宽度,默认为0.8。
  4. color:表示条形的颜色。
  5. 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!”)输出上图结果作为执行结束提示。

可以从相应路径中打开文件以检查是否成功保存。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/110141113