《scikit-learn机器学习常用算法原理及编程实战》—2.5.3 画图操作
2.5.3 画图操作
本节通过一系列的例子,来演示Matplotlib的画图操作。首先给出最终的图形,接着解释思路及用到的关键函数,读者可以先试着思考如何实现,对于用到的关键接口,可以通读一下Matplotlib相关接口的文档。所有的示例代码均包含在随书代码ch02.05.ipynb中,读者可以试着改变一些参数,以便学习这些参数的用法。
在图2-15中左图是使用plt.scatter()函数画出来的,需要特别关注命名参数c的使用。方法是生成一定数量的随机点,计算随机点的反正切np.arctan2(Y, X),把这个值作为随机点的颜色。
n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X)
plt.subplot(1, 2, 1)
plt.scatter(X, Y, s=75, c=T, alpha=.5)
plt.xlim(-1.5, 1.5)
plt.xticks(())
plt.ylim(-1.5, 1.5)
plt.yticks(())
图2-15 画点与填充
对于图2-15中的右图,是使用plt.fill_between()函数来填充的,需要特别关注命名参数where的使用。先画出两条正弦曲线,在x = 0这条直线和正弦曲线之间填充指定的颜色。
n = 256
X = np.linspace(-np.pi, np.pi, n, endpoint=True)
Y = np.sin(2 * X)
plt.subplot(1, 2, 2)
plt.plot(X, Y + 1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y + 1, color='blue', alpha=.25)
plt.plot(X, Y - 1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y - 1, (Y - 1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y - 1, (Y - 1) < -1, color='red', alpha=.25)
plt.xlim(-np.pi, np.pi)
plt.xticks(())
plt.ylim(-2.5, 2.5)
plt.yticks(())
如图2-16左图,使用 plt.bar()函数来画出柱状图,留意命名参数facecolor和edgecolor的使用。生成24个随机值,调用两次plt.bar()函数分别画在上下两侧。再调用plt.text()函数把数值画在对应的柱状图上。
n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
plt.subplot(1, 2, 1)
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for x, y in zip(X, Y1):
plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va= 'bottom')
for x, y in zip(X, Y2):
plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va= 'top')
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())
图2-16 柱状图的等高线
如图2-16右图所示,使用plt.contourf()函数填充等高线,其中命名参数cmap表示颜色映射风格。数接着用plt.contour()函数画出等高线。需要留意np.meshgrid()函数的用法。最后使用plt.clable()函数画出等高线上的数字。
def f(x,y):
return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)
plt.subplot(1, 2, 2)
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)
plt.xticks(())
plt.yticks(())
如图2-17左图所示,使用plt.imshow()函数把数组当成图片画出来,命名参数cmap用来决定数组到颜色的映射网格。最后使用plt.colorbar()函数画出颜色条。
图2-17 热成像图及饼图
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
plt.subplot(1, 2, 1)
n = 10
x = np.linspace(-3, 3, 4 * n)
y = np.linspace(-3, 3, 3 * n)
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y), cmap='hot', origin='low')
plt.colorbar(shrink=.83)
plt.xticks(())
plt.yticks(())
如图2-17右图所示,使用plt.pie()函数画出饼图,总共有20个饼图,其中19个是等角度的扇形,最后一个突出的扇形是其他扇形角度的两倍,使用命名参数explode来实现这个效果。各个扇形的填充颜色逐渐变深,使用命名参数colors来实现这个效果。
plt.subplot(1, 2, 2)
n = 20
Z = np.ones(n)
Z[-1] *= 2
plt.pie(Z, explode=Z*.05, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.axis('equal')
plt.xticks(())
plt.yticks()
如图2-18左图所示,使用坐标轴的set_major_locator()和set_minor_locator()方法把坐标刻度设置成MultipleLocator样式。然后再使用坐标轴的grid()函数在坐标轴的刻度之间画上线段,这样就生成了我们需要的网格。
ax = plt.subplot(1, 2, 1)
ax.set_xlim(0,4)
ax.set_ylim(0,3)
ax.xaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.yaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color=
'0.75')
ax.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color=
'0.75')
ax.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color=
'0.75')
ax.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color=
'0.75')
ax.set_xticklabels([])
ax.set_yticklabels([])
图2-18 网格及极坐标图
如图2-18右图所示,使用plt.bar()和bar.set_facecolor()来填充不同的颜色。其中一个关键点是在创建子图或坐标轴时,需要指定polar=True才能显示出极坐标图。
ax = plt.subplot(1, 2, 2, polar=True)
N = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / N)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = plt.bar(theta, radii, width=width, bottom=0.0)
for r,bar in zip(radii, bars):
bar.set_facecolor(plt.cm.jet(r/10.))
bar.set_alpha(0.5)
ax.set_xticklabels([])
ax.set_yticklabels([])
Matplotlib有大量的细节,完整的教程都可以写一本书。本书用到的知识不会特别复杂,掌握这些基本的知识就足够用了。如果想深入学习Matplotlib,可以访问官方网站 matplotlib.org。
- 点赞
- 收藏
- 关注作者
评论(0)