Matplotlib 线性图

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()

输出结果如下:
Matplotlib 线性图

扩展这个例子,显示如下函数的图像: 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 线性图

改变线型、颜色和刻度标签

极客教程前面章节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()

输出结果如下:
Matplotlib 线性图

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()

输出结果如下:
Matplotlib 线性图

笛卡儿坐标系

前面所见的线型图,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 线性图

用注释和箭头标明曲线上某个数据点的位置,这一功能非常有用。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()

输出结果如下:
Matplotlib 线性图

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 添加网格
Matplotlib 添加文本

赞(3)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

最新文章