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

举报
华章计算机 发表于 2019/05/31 16:37:02 2019/05/31
【摘要】 本书摘自《scikit-learn机器学习常用算法原理及编程实战》一书中的第2章,第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(())

image.png

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

image.png

图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()函数画出颜色条。

image.png

图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([])

image.png

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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。