1、基本图表绘制
1.1 绘制折线图
使用plt.plot()函数可以绘制折线图
import matplotlib.pyplot as plt
x = [1,2,3]
y = [2,4,6]
plt.plot(x,y)
plt.show()
如果想让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()
1.2 绘制柱形图
x = [1,2,3,4,5]
y = [5,4,3,2,1]
plt.bar(x,y)
plt.show()
1.3 绘制散点图
x = np.random.rand(10)
y = np.random.rand(10)
plt.scatter(x,y)
plt.show()
1.4 绘制直方图
直方图分为频数直方图和频率直方图,横坐标为相关数据,纵坐标为该数据出现的频数或频率。使用plt.hist()函数可以绘制直方图,演示代码如下
# 随机生成10000 个服从正态分布的数据
data = np.random.randn(10000)
# 绘制频数直方图: bins为颗粒度,即直方图的柱形数量; edgecolor 为 柱形边框颜色
plt.hist(data,bins=40,edgecolor="black")
plt.show()
运行结果如上图所示。其中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()
运行结果如下:
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()
运行结果如下:
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这条线被压缩得很平,影响数据可视化的效果。
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()
运行结果如下:
第2行代码中的SimHei是黑体的英文名称,如果想使用其他字体,可参考下面的字体中英文名称对照表。
2.7 绘制多图
有时我们需要在一张画布上绘制多个图表,如下图所示。这种效果可以利用Matplotlib库的当前图形(figure)和当前轴(axes)概念来实现,这两个概念对应的就是当前画布及当前子图,在一张画布(figure)上可以绘制多张子图(axes)。绘制多图通常采用subplot()函数或subplots()函数。
首先讲解subplot()函数,它的参数通常表示为一个3位整数,该整数的各位数字分别代表子图的行数、列数及当前子图的序号。例如,subplot(221)表示绘制2行2列的子图(共4张子图),当前绘制的是第1张子图,如下图所示。
演示代码如下:
# 绘制第一张子图: 折线图
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])
运行结果如下图所示。
总结来说,使用subplot()函数在画布中绘制图表时,每次都要调用该函数来指定位置;而使用subplots()函数只需调用生成子图的ax,就可以一次生成多张子图。