出了前面介绍的散点图外,在数据可视化工作中还经常需要绘制折线图。在本节的内容中,将详细讲解在Python程序中使用各种库绘制折线图的知识。
我们可以使用库Matplotlib绘制折线图,例如在下面的实例文件zhe01.py中,使用matplotlib绘制了一个简单的折线图,现实样式是默认的效果。
源码路径:daima\3\3-2\zhe01.py
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
在上述实例代码中,使用平方数序列1、4、9、16和25来绘制一个折线图,在具体实现时,只需向matplotlib提供这些平方数序列数字就能完成绘制工作。
(1)导入模块pyplot,并给它指定了别名plt,以免反复输入pyplot,在模块pyplot中包含了很多用于生成图表的函数。
(2)创建了一个列表,在其中存储了前述平方数。
(3)将创建的列表传递给函数plot(),这个函数会根据这些数字绘制出有意义的图形。
(4)通过函数plt.show()打开matplotlib查看器,并显示绘制的图形。
执行效果如图3-11所示。
图3-11 执行效果
本章前面实例文件zhe01.py的执行效果不够完美,开发者可以对绘制的线条样式进行灵活设置。例如可以设置线条的粗细、实现数据准确性校正等操作。例如在下面的实例文件zhe02.py中,演示了使用matplotlib绘制指定样式折线图效果的过程。
源码路径:daima\3\3-2\zhe02.py
import matplotlib.pyplot as plt #导入模块
input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
# 设置图表标题,并在坐标轴上添加标签
plt.title("Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("ARG Value", fontsize=14)
# 设置单位刻度的大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
(1)第4行代码中的“linewidth=5”:设置线条的粗细。
(2)第4行代码中的函数plot():当向函数plot()提供一系列数字时,它会假设第一个数据点对应的x坐标值为0,但是实际上我们的第一个点对应的x值为1。为改变这种默认行为,可以给函数plot()同时提供输入值和输出值,这样函数plot()可以正确地绘制数据,因为同时提供了输入值和输出值,所以无需对输出值的生成方式进行假设,所以最终绘制出的图形是正确的。
(3)第6行代码中的函数title():设置图表的标题。
(4)第6到8行中的参数fontsize:设置图表中的文字大小。
(5)第7行中的函数xlabel()和第8行中的函数ylabel():分别设置x轴的标题和y轴的标题。
(6)第10行中的函数tick_params():设置刻度样式,其中指定的实参将影响x轴和y轴上的刻度(axis='both'),并将刻度标记的字体大小设置为14(labelsize=14)。
执行效果如图3-12所示。
图3-12 执行效果
我们可以用很多个点组成一个折线,请看下面的实例文件zhe03.py,功能是使用matplotlib函数scatter()绘制1000个散点组成折线图。
源码路径:daima\3\3-2\zhe03.py
import matplotlib.pyplot as plt
x_values = range(1, 1001)
y_values = [x*x for x in x_values]
'''
scatter()
x:横坐标 y:纵坐标 s:点的尺寸
'''
plt.scatter(x_values, y_values, s=10)
# 设置图表标题并给坐标轴加上标签
plt.title('Square Numbers', fontsize=24)
plt.xlabel('Value', fontsize=14)
plt.ylabel('Square of Value', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
在上述代码中,函数axis()有4个参数值[xmin, xmax, ymin, ymax],分别表示x、y坐标轴的最小值和最大值。执行效果如图3-13所示。
图3-13 执行效果
使用颜色映射可以绘制渐变色的折线图,颜色映射是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律,例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。请看下面的实例文件zhe04.py,功能是使用matplotlib函数scatter()绘制渐变色的折线图。
源码路径:daima\3\3-2\zhe04.py
import matplotlib.pyplot as plt
x_values = range(1, 1001)
y_values = [x*x for x in x_values]
'''
scatter()
x:横坐标 y:纵坐标 s:点的尺寸
'''
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='none', s=10)
# 设置图表标题并给坐标轴加上标签
plt.title('Square Numbers', fontsize=24)
plt.xlabel('Value', fontsize=14)
plt.ylabel('Square of Value', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
在上述代码中,将参数c设置成了一个y值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。这些代码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色。执行效果如图3-14所示。
图3-14 执行效果
在Matplotlib绘图系统中,可以显式地控制图像、子图和坐标轴。Matplotlib中的“图像”指的是用户界面看到的整个窗口内容。在图像里面有所谓“子图”,子图的位置是由坐标网格确定的,而“坐标轴”却不受此限制,可以放在图像的任意位置。当调用plot()函数的时候,Matplotlib调用gca()函数以及gcf()函数来获取当前的坐标轴和图像。如果无法获取图像,则会调用figure()函数来创建一个。从严格意义上来说,是使用subplot(1,1,1) 创建一个只有一个子图的图像。
在Matplotlib绘图系统中,所谓“图像”就是GUI里以“Figure #”为标题的那些窗口。图像编号从1开始,与MATLAB的风格一致,而与Python从0开始编号的风格不同。表3-1中的参数是图像的属性。
表3-1 图像的属性
参数 |
默认值 |
描述 |
num |
1 |
图像的数量 |
figsize |
figure.figsize |
图像的长和宽(英寸) |
dpi |
figure.dpi |
分辨率(点/英寸) |
facecolor |
figure.facecolor |
绘图区域的背景颜色 |
edgecolor |
figure.edgecolor |
绘图区域边缘的颜色 |
frameon |
True |
是否绘制图像边缘 |
例如在下面的实例文件zhe05.py中,演示了让一个折线图和一个散点图同时出现在同一个绘画框中的过程。
源码路径:codes\3\3-2\zhe05.py
import matplotlib.pyplot as plt #将绘画框进行对象化
fig=plt.figure() #将p1定义为绘画框的子图,211表示将绘画框划分为2行1列,最后的1表示第一幅图
p1=fig.add_subplot(211)
x=[1,2,3,4,5,6,7,8]
y=[2,1,3,5,2,6,12,7]
p1.plot(x,y) #将p2定义为绘画框的子图,212表示将绘画框划分为2行1列,最后的2表示第二幅图
p2=fig.add_subplot(212)
a=[1,2]
b=[2,4]
p2.scatter(a,b)
plt.show()
上述代码执行后的效果如图3-15所示。
图3-15 执行效果
在Python程序中,最简单绘制曲线的方式是使用数学中的正弦函数或余弦函数。例如在下面的实例文件zhe06.py中,演示了使用正弦函数和余弦函数绘制曲线的过程。
源码路径:codes\3\3-2\zhe06.py
from pylab import *
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plot(X,C)
plot(X,S)
show()
执行后的效果如图3-16所示。
图3-16 执行效果
在上述实例中,展示的是使用的Matplotlib默认配置的效果。其实开发者可以调整大多数的默认配置,例如图片大小和分辨率(dpi)、线宽、颜色、风格、坐标轴、坐标轴以及网格的属性、文字与字体属性等。但是,Matplotlib的默认配置在大多数情况下已经做得足够好,开发人员可能只在很少的情况下才会想更改这些默认配置。例如在下面的实例文件zhe07.py中,展示了使用Matplotlib的默认配置和自定义绘图样式的过程。
源码路径:codes\3\3-2\zhe07.py
# 导入 matplotlib 的所有内容(nympy 可以用 np 这个名字来使用)
from pylab import *
# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
figure(figsize=(8,6), dpi=80)
# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
subplot(1,1,1)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
# 绘制余弦曲线,使用蓝色的、连续的、宽度为 1 (像素)的线条
plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# 绘制正弦曲线,使用绿色的、连续的、宽度为 1 (像素)的线条
plot(X, S, color="green", linewidth=1.0, linestyle="-")
# 设置横轴的上下限
xlim(-4.0,4.0)
# 设置横轴记号
xticks(np.linspace(-4,4,9,endpoint=True))
# 设置纵轴的上下限
ylim(-1.0,1.0)
# 设置纵轴记号
yticks(np.linspace(-1,1,5,endpoint=True))
# 以分辨率 72 来保存图片
# savefig("exercice_2.png",dpi=72)
# 在屏幕上显示
show()
上述实例代码中的配置与默认配置完全相同,我们可以在交互模式中修改其中的值来观察效果。执行后的效果如图3-17所示。
图3-17 执行效果
在绘制曲线时可以改变线条的颜色和粗细,例如以蓝色和红色分别表示余弦和正弦函数,然后将线条变粗一点,接着在水平方向拉伸一下整个图。
...
figure(figsize=(10,6), dpi=80)
plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plot(X, S, color="red", linewidth=2.5, linestyle="-")
...
此时的执行效果如图3-18所示。
图3-18 改变线条的颜色和粗细
请看下面的实例文件zhe07-1.py,功能是使用Matplotlib分别绘制正弦曲线和余弦曲线,并分别在绘制的曲线上标注正弦和余弦。
源码路径:codes\3\3-2\zhe07.py
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入需要生成数据的numpy模块
'''
第一种方式 text()
text(x,y,s,fontdict=None, withdash=False)
参数说明:(1)x,y 坐标位置
(2) 显示的文本
'''
x = np.arange(0, 2 * np.pi, 0.01)
plt.plot(np.sin(x))
'''x,y 代表着坐标系中数值'''
plt.text(20, 0, 'sin(0) = 0')
'''
第二种方式 figtext()
使用figtext时候,x,y代表相对值,图片的宽度
'''
x2 = np.arange(0, 2 * np.pi, 0.01)
plt.plot(np.cos(x2))
''''''
plt.figtext(0.5, 0.5, 'cos(0)=0')
plt.show()
执行效果如图3-19所示。
图3-19 执行效果