Matplotlib 线性图,图表的所有类型中,线性图最为简单,线型图的各个数据点由一条线来连接,一对对(x, y)值组成的数据点在图表中的位置取决于两条轴(x和y)的刻度范围。
本文会介绍为函数绘制线型图、如何改变线性图的颜色,线型及x
,y
轴的刻度标签、绘制笛卡尔坐标系及Pandas
数据结构绘制线型图。学习本章内容前前可以先了解NumPy 创建数组和Pandas 创建DataFrame,更多知识可以参考极客教程Numpy和极客教程Pandas。
简单函数线性图
举例来说,你可以绘制由数学函数生成的数据点,比如为一个普通函数的图像作图:
y = sin(3*x)/x
为此我们需要创建两个Numpy数组,首先创建包含x
值的数组,用作x
轴。我们使用np.arange()
函数定义一个元素递增的序列。然后,用np.sin()
函数可直接求得这一列x
值所对应的y
值。
完成上述运算后,再调用plot()函数绘制图像即可,如下所示:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y)
plt.show()
输出结果如下:
扩展这个例子,显示如下函数的图像: y = sin(n*x)/x,如下所示,matplotlib
自动为每条线分配一种不同的颜色。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
y2 = np.sin(x*2)/x
y3 = np.sin(x*1)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y)
plt.plot(x, y2)
plt.plot(x, y3)
plt.show()
输出结果如下:
改变线型、颜色和刻度标签
极客教程前面章节Matplotlib Numpy有介绍到,我们可以自己选择线型、颜色等。可以用plot()
函数的第三个参数指定颜色(如下表所示)、线性,把这些设置所用的字符编码放到同一个字符串即可。你还可以使用两个单独的关键字参数,用color
指定颜色,用linestyle
指定线性。
编码 | 颜色 |
---|---|
b |
蓝色 |
g |
绿色 |
r |
红色 |
c |
蓝绿色 |
m |
洋红 |
y |
黄色 |
k |
黑色 |
w |
白色 |
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
y2 = np.sin(x*2)/x
y3 = np.sin(x*1)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y, 'k--', linewidth=3)
plt.plot(x, y2, 'm-.')
plt.plot(x, y3, color='#87a3cc', linestyle='--')
plt.show()
输出结果如下:
x
轴的数值范围为-2π ~ 2π
,但是刻度标签默认使用数值形式,你需要用π
的倍数代替数值。同理,你也可以替换y
轴刻度的标签,方法是使用xticks()
和yticks()
函数,分别为每个函数传入两列数值:第一列表存储刻度的位置,第二个列表存储刻度的标签。
在这个例子中,要正确显示符号π
,需要使用含有LaTex表达式的字符串,记得将其置于两个$
之中,并在前面加上r
前缀,如下所示:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
y2 = np.sin(x*2)/x
y3 = np.sin(x*1)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y, color='b')
plt.plot(x, y2, color='r')
plt.plot(x, y3, color='g')
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
[r'-2\pi', r'-\pi', r'0', r'+\pi', r'+2\pi'])
plt.yticks([-1,0,+1,+2,+3],
[r'-1', r'0', r'+1', r'+2', r'+3'])
plt.show()
输出结果如下:
笛卡儿坐标系
前面所见的线型图,x
轴和y
轴总是置于Figure的边缘(跟图像的边框重合)。另外一种显示轴的方法是,两条轴穿过原点(0,0),就是笛卡儿坐标轴。
具体做法是,使用gca()
函数获取Axes
对象,通过这个对象指定每条边的位置:上、下、左、右。使用set_color()
函数,把颜色设置为none
,删除跟坐标轴不符合的边(右和上),然后用set_position()
函数移动跟x
轴和y
轴相符的边框,使其穿过原点(0,0)。
这时,两条轴在图表中部位置交叉,这个位置就是笛卡儿坐标系的原点。如下所示:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
y2 = np.sin(x*2)/x
y3 = np.sin(x*1)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y, color='b')
plt.plot(x, y2, color='r')
plt.plot(x, y3, color='g')
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
[r'-2\pi', r'-\pi', r'0', r'+\pi', r'+2\pi'])
plt.yticks([-1,0,+1,+2,+3],
[r'-1', r'0', r'+1', r'+2', r'+3'])
ax = plt.gca()
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.show()
输出结果如下:
用注释和箭头标明曲线上某个数据点的位置,这一功能非常有用。matplotlib库的annotate()
函数特别适用于添加注释。它的参数设置略显繁琐,第一个参数为含有LaTex表达式,要在图形中显示的字符串。xy
属性表示注释在图表中的位置。xytext
属性表示文本注释跟它解释的数据点之间的距离。arrowprops
属性表示箭头的属性。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(x*3)/x
y2 = np.sin(x*2)/x
y3 = np.sin(x*1)/x
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.plot(x, y, color='b')
plt.plot(x, y2, color='r')
plt.plot(x, y3, color='g')
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi],
[r'-2\pi', r'-\pi', r'0', r'+\pi', r'+2\pi'])
plt.yticks([-1,0,+1,+2,+3],
[r'-1', r'0', r'+1', r'+2', r'+3'])
plt.annotate(r'\lim_{x\to 0}\frac{sin(x)}{x}=1', xy=[0,1], xycoords='data',
xytext=[30,30],fontsize=16, textcoords='offset points',
arrowprops=dict(arrowstyle='->',connectionstyle="arc3, rad=.2"))
ax = plt.gca()
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.show()
输出结果如下:
Pandas数据结构绘制线型图
我们见识一下用matplotlib库把pandas库的DataFrame数据结构绘制成图表是多么容易,把DataFrame中的数据做成线型图很简单,只需要把DataFrame作为参数传入plot()
函数,就能得到多序列线型图。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
data = {'series1' : [1,3,4,3,5],
'series2' : [2,4,5,2,4],
'series3' : [3,2,3,1,3]}
df = pd.DataFrame(data)
x = np.arange(5)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.axis([0,5,0,7])
plt.plot(x,df)
plt.legend(data, loc=2)
plt.show()
输出结果如下:
极客教程相关文章推荐:
Matplotlib 处理日期
Matplotlib 添加图例
Matplotlib 添加网格
Matplotlib 添加文本