pyplot模块虽然用法简单,但不适合在较大的应用程序中使用。 为了将面向对象的绘图库包装成只使用函数的调用接口,pyplot模块的内部保存了当前图表以及当前子图等信息。当前的图表和子图可以使用plt.gcf()和plt.gca()获得,分别表示"Get Current Figure"和"Get Current Axes"。在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,比如说: plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
快速绘图:
import kNN
import matplotlib.pyplot as plt
datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt')
plt.figure() #只有一张图的情况下不写会自动生成
plt.subplot(121)
plt.scatter(datingDataMat[:, 1],datingDataMat[:, 2],color='r')
plt.subplot(122)
plt.plot([1,2,3], [4,5,6])
plt.show()
面向对象方法画出相同的图:
import kNN
import matplotlib.pyplot as plt
datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt')
fig = plt.figure() #创建一张图命名为fig
ax1 = fig.add_subplot(121) #将fig分成1行2列,第一子图命名为ax1
ax1.scatter(datingDataMat[:, 1],datingDataMat[:, 2],color='r') #对第一子图ax1画散点图
ax2 = fig.add_subplot(122) #第二子图命名为ax2
ax2.plot([1,2,3], [4,5,6]) #对第二子图画直线图
plt.show() #这种写法中每一步操作都有一个对象
同时画两张图:
import kNN
import matplotlib.pyplot as plt
datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt')
fig1 = plt.figure(1) #建立fig1并选定fig1,下面如果不换对象,操作都是对fig1,在面向对象的写法中,因为每一部都写入了对象,所以不需要考虑写法混乱的情况
ax1 = fig1.add_subplot(121)
ax1.scatter(datingDataMat[:, 1],datingDataMat[:, 2],color='r')
ax2 = fig1.add_subplot(122)
ax2.plot([1,2,3], [4,5,6])
fig2 = plt.figure(2)
ax3 = fig2.add_subplot(111)
ax3.plot([1,2,3], [4,5,6])
plt.show()
快速绘图写法:
import matplotlib.pyplot as plt
plt.figure(1) # 选定第一张图
plt.subplot(211) # 选定第一张图中的第一张子图
plt.plot([1,2,3]) # 在第一张图的第一张子图中画
plt.subplot(212) # 选定第一张图中的第二张子图
plt.plot([4,5,6]) # 在第一张图的第二张子图中画
plt.figure(2) # 选定第二张图
plt.plot([4,5,6]) # 不写plt.subplot(111)(括号中的111不可省略)默认创建子图subplot(111)
plt.figure(1) # 切换到figure 1 ; 子图subplot(212)仍旧是当前图
plt.subplot(211) # 令子图subplot(211)成为figure1的当前图
plt.title('Easy as 1,2,3') # 添加subplot 211 的标题
在快速绘图中必须要考虑操作对象,不能能混
另外面向对象绘图中加坐标名字和标题要加set_:
import matplotlib.pyplot as plt
x = [5, 6, 7, 8]
y = [7, 8, 5, 6]
fig = plt.figure(1)
ax1 = fig.add_subplot(111)
ax1.plot(x,y)
ax1.set_title('First Chart')
ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')