scikit-learn机器学习常用算法原理及编程实战》—2.5.3 画图操作

网友投稿 427 2022-05-30

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

《scikit-learn机器学习常用算法原理及编程实战》—2.5.3 画图操作

如图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。

机器学习 scikit-learn

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:坚持写NoSQL技术博客以来的几点感想..
下一篇:如何在软件发布计划中自动化语义化版本与变更日志
相关文章

 发表评论

暂时没有评论,来抢沙发吧~