Matplotlib 基本使用

233 阅读5分钟

1、基本图表绘制

1.1 绘制折线图

使用plt.plot()函数可以绘制折线图

import matplotlib.pyplot as plt
x = [1,2,3]
y = [2,4,6]
plt.plot(x,y)
plt.show()

image.png

如果想让x和y之间在数学上存在关联,但列表又不太容易进行数学运算,就可以通过NumPy库引入一维数组进行数学运算

import numpy as np

x1 = np.array([1,2,3])

# 第一条线 y = x + 1
y1 = x1  + 1

plt.plot(x1,y1)

# 第二条线  y = x*2

y2 = x1 * 2

plt.plot(x1,y2,color="red",linewidth=3,linestyle="--")

plt.show()


image.png

1.2 绘制柱形图

x = [1,2,3,4,5]
y = [5,4,3,2,1]
plt.bar(x,y)
plt.show()

image.png

1.3 绘制散点图

x = np.random.rand(10)
y = np.random.rand(10)
plt.scatter(x,y)
plt.show()

image.png

1.4 绘制直方图

直方图分为频数直方图和频率直方图,横坐标为相关数据,纵坐标为该数据出现的频数或频率。使用plt.hist()函数可以绘制直方图,演示代码如下

# 随机生成10000 个服从正态分布的数据
data = np.random.randn(10000)

# 绘制频数直方图: bins为颗粒度,即直方图的柱形数量; edgecolor 为 柱形边框颜色

plt.hist(data,bins=40,edgecolor="black")
plt.show()

image.png

运行结果如上图所示。其中x轴表示随机生成的数据,y轴则表示该数据出现的次数,即频数。此外,若想绘制频率直方图,可以设置density参数为1

2、数据可视化常用技巧

2.1 添加文字说明

使用plt.title()函数为图表添加标题,使用plt.xlabel()和plt.ylabel()函数分别为x轴和y轴添加标签

x = [1,2,3]
y = [2,4,6]
plt.plot(x,y)
# 添加标题
plt.title("title")
# 添加x轴
plt.xlabel("x")
# 添加y轴
plt.ylabel("y")
#显示
plt.show()

运行结果如下:

image.png

2.2 添加图例

使用plt.legend()函数给图表添加图例,添加前需要设置好label(标签)参数,代码如下。

import numpy as np
# 设置第一条线: 设置label(标签) 为 "y = x +1"
x1 = np.array([1,2,3])
y1 = x1 + 1
plt.plot(x1,y1,label="y = x + 1")

# 设置第二条线: 为 y = x*2
y2 = x1* 2
plt.plot(x1,y2,color="red",linestyle="--",label="y = x * 2")
# 设置图例位置为 左上角
plt.legend(loc="upper left")

plt.show()

运行结果如下:

image.png

2.3 设置双坐标轴

从前面的介绍可知,可以在一张图表里绘制两条线,但如果两条线的取值范围相差较大,那么绘制出的图表效果会不美观,此时需要采用双坐标轴来呈现图表,即为两条线各自绘制y轴。在绘制第1条线的代码之后添加如下代码,即可设置双坐标轴。

需要注意的是,如果设置了双坐标轴,那么每绘制一次图表就得添加一次图例,而不能在最后统一添加图例。这里以y=x和y=x2为例,演示如何设置双坐标轴,代码如下。

x1 = np.array([10,20,30])

y1 = x1

plt.plot(x1,y1,color="red",linestyle="--",label="y=x")

plt.legend(loc="upper left")

# 设置双轴坐标
plt.twinx()

y2 = x1 * x1 

plt.plot(x1,y2,label="y = x^2")

plt.legend(loc="upper right")

plt.show()

运行结果如下图所示,可以看到左右两条y轴的取值范围相差很大。如果不设置双坐标轴,会导致y=x这条线被压缩得很平,影响数据可视化的效果。

image.png

2.4 设置图表大小

plt.rcParams["figure.figsize"] = (8,6)

第1个元素代表长,第2个元素代表宽,这里的数字8和6分别代表800像素和600像素。

2.5 设置x轴刻度的角度

如果x轴因为刻度内容较多,导致刻度太密,不便于阅读,可以通过设置刻度的角度来进行调节,代码如下。其中45表示45°,可以根据需要更改为其他数值。

plt.xticks(rotation=45)

2.6 解决中文显示问题

使用Matplotlib库画图时,默认不能正常显示中文,通过如下代码可解决该问题。由于更改字体会导致显示不出负号“-”,需要将配置文件中的axes.unicode_minus参数设置为False。

# 用来显示正常中文标签
plt.rcParams["font.sans-serif"] = ["SimHei"]

# 解决负号显示位为方块的问题
plt.rcParams["axes.unicode_minus"] = False

x = [1,2,3]
y = [2,4,6]
plt.plot(x,y)
# 添加标题
plt.title("title标签")
# 添加x轴
plt.xlabel("x")
# 添加y轴
plt.ylabel("y")
#显示
plt.show()

运行结果如下:

image.png

第2行代码中的SimHei是黑体的英文名称,如果想使用其他字体,可参考下面的字体中英文名称对照表。

image.png

2.7 绘制多图

有时我们需要在一张画布上绘制多个图表,如下图所示。这种效果可以利用Matplotlib库的当前图形(figure)和当前轴(axes)概念来实现,这两个概念对应的就是当前画布及当前子图,在一张画布(figure)上可以绘制多张子图(axes)。绘制多图通常采用subplot()函数或subplots()函数。

image.png

首先讲解subplot()函数,它的参数通常表示为一个3位整数,该整数的各位数字分别代表子图的行数、列数及当前子图的序号。例如,subplot(221)表示绘制2行2列的子图(共4张子图),当前绘制的是第1张子图,如下图所示。

image.png

演示代码如下:

# 绘制第一张子图: 折线图
ax1 = plt.subplot(221)
plt.plot([1,2,3],[2,4,6])

# 绘制第2张子图: 柱形图
ax2 = plt.subplot(222)
plt.bar([1,2,3],[2,4,6])


# 绘制第3张子图: 散点图
ax3 = plt.subplot(223)
plt.scatter([1,3,5],[2,4,6])

# 绘制第4张子图: 直方图
ax4 = plt.subplot(224)
plt.hist([2,2,2,3,4])

运行结果如下图所示。

image.png

总结来说,使用subplot()函数在画布中绘制图表时,每次都要调用该函数来指定位置;而使用subplots()函数只需调用生成子图的ax,就可以一次生成多张子图。