图形化显示

Matplotlib的官方文档首页略显庞杂,熟悉之后会发现包罗万象,这里是最好的Matplotlib学习场所,所以针对文档的内容做一个简单的导读,最后列出自己总结的作图基本语法,仅供参考。

文档导读

Examples:提供了大量的实际代码案例,几乎囊括了Matplotlib的所有功能。建议找一些初步探索,了解Matplotlib的强大。但是这里不适合初学者学习,建议有了基础训练再来找自己需要的案例。Gallery页面提供了更方便的索引方式,可以直观的看到Examples的所有图像。

Pyplot

Plotting commands summary提供了Pyplot模块作图的命令查询和常见的参数展示。

Docs

这里是整个文档的真正目录索引,如果觉得找起来麻烦,直接点击pdf,下载pdf版本。如果药了解基础知识建议从Usage开始。

Modules & Index

Modules提供了Matplotlib的所有子模块列表,方便查询 Index是整个文档的所有内容索引。

简单例子

首先让自己画出一个最基本的线图,有了直观的新鲜感觉,后面的事情会简单许多。

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.arange(10)
plt.plot(x)

关键定义:Figures、Axes、axis、plot

Matplotlib作图时,各个组件(暂且这么叫)也是有结构关系的,最顶层时稳定的机器环境,简单说是matplotlib.pyplot这个组块,在这一个组块上,利用其他的函数来不断的添加画图时的各个元素。而这个组块的概念和Matlab很类似。 下一层是第一个面向对象的接口层,在这里,pyplot利用较少的特定函数完成类似于新建画布、图像等工作。之后的所有工作主要在这一层实例化的类上进行操作。 在上图中标注了重要的类,下面重点介绍:

  • Figure:即上面红框部分,简单理解是一个画布。一个画布里可以有零个或者多个坐标轴。
  • Axes:即上面蓝色框内的部分,可以理解为坐标系,是我们真正作图的地方,一个画布里可以有多个坐标系,而一个坐标系只能属于一个画布。
  • Axis:坐标轴,如果是二维坐标系有两个坐标轴,三维的会有三个坐标轴。

基本函数

生成画布

罗列生成figure、axes的常用函数和用法。

  • plt.figure:直接生成一个画布,建议和add_axes一起使用,注意,add_axes的参数必填,否则后续作图会报错。
y = np.random.rand(10)
x = np.arange(10)

left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
fig1 = plt.figure()
ax1 = fig1.add_axes((left, bottom, width, height), axisbg="#e1e1e1")
ax1.plot(x,y)
  • plt.axes:单独使用既可生成一个坐标系(默认自动生成了画布)。
ax2 = plt.axes()
ax2.plot(x,y)
  • plt.subplot:区别于下面的plt.subplots,这里只会生成一个画布和坐标系,返回的是生成的坐标系。
ccc = plt.subplot(111)
ccc.plot(x,y)
  • plt.subplots:该函数会返回一个画布和一个或多个坐标系,在画图中非常常用。
fig, ax = plt.subplots()
ax.plot(x, y1);
  • plt.plot:该函数直接使用,默认生成了画布和坐标系。
x = np.arange(5)
y = np.arange(5.0)/2
plt.plot(x,y)

同一个画布中增加多个坐标系

  • 利用subplots直接添加
fig, axes = plt.subplots(ncols=2, nrows=3)
fig, axes = plt.subplots(1, 2)
  • 注意:坐标系以多维数组的形式存储在了axes中,调用时要按照数组的方式进行选择。可以考虑for循环的方式增加图形细节,减少重复劳动。
ncols, nrows = 3, 3

fig, axes = plt.subplots(nrows, ncols)

for m in range(nrows):
    for n in range(ncols):
        axes[m, n].set_xticks([])
        axes[m, n].set_yticks([])
        axes[m, n].text(0.5, 0.5, "axes[%d, %d]" % (m, n),horizontalalignment='center')
  • 更自定义的方法是在建立了画布之后,对应的画布利用add_axes函数设置,并且可以自定义各个图形的位置和大小。

同一个坐标系中画多幅图

  • 生成了坐标系,可以调用坐标系的plot方法添加需要的图形,可以添加多个。
ax = plt.subplot(111)
ax.bar(x,y)
ax.plot(np.arange(10))
ax.plot(np.sin(np.linspace(1,5,num=10)))

为图片增加细节

到目前为止画出的图形都还比较“简陋”,下面为图形增加更多的细节内容。

  • 为图片整容:不喜欢默认的图片风格,可以进行一次全面的替换。图片风格在Matplotlib中属于Style子模块,利用下面的代码可以实现风格的变化,能够变化的代码风格利用mpl.style.available可以查看。
import matplotlib as mpl
mpl.style.library
mpl.style.available
mpl.style.use('bmh')

# 可以替换的风格
#u'seaborn-darkgrid',
#u'seaborn-notebook',
#u'classic',
#u'seaborn-ticks',
#u'grayscale',
#u'bmh',
#u'seaborn-talk',
#u'dark_background',
#u'ggplot',
#u'fivethirtyeight',
#u'seaborn-colorblind',
#u'seaborn-deep',
#u'seaborn-whitegrid',
#u'seaborn-bright',
#u'seaborn-poster',
#u'seaborn-muted',
#u'seaborn-paper',
#u'seaborn-white',
#u'seaborn-pastel',
#u'seaborn-dark',
#u'seaborn-dark-palette'

图表中可以有丰富的细节,主要有这些内容:图表名称、图例、X轴刻度和标识、Y轴刻度和标识、箭头、文字说明、辅助线(横线、竖线)、图片大小、位置、中文显示(特殊)、线的细节。由于内容庞杂,这里近列出相关的函数和使用案例,必要时进行说明,更具体的说明请参考官方文档或者Jupyter Notebook中的help内容。

  • 图表标题
axes.set_title("legend(loc=%d)" % (n+1))
  • 图片大小、位置:回到最开始介绍的“生成画布”部分,通过增加如下的属性设置画布的大小。需要注意,下方add_axes中的四个指标: left, bottom, width,height 都是针对画布来设置的,单位可以理解为“一个画布大小”。借用这个方法可以顺带着完成同一个画布设置多个坐标系的工作。
fig = plt.figure(figesize = (4,2))
ax1 = fig.add_axes((0,0,1,1))
ax2 = fig.add_axes((1,1,2,2),axisbg="#e1e1e1")
ax3 = fig.add_axes((0.5,0.5,0.5,0.5),axisbg="#e1e1e1")
ax1.plot(x,y);
  • x、y轴的刻度显示和刻度范围限制
ax.set_ylim(-15, 40)
ax.set_yticks([-10, 0, 10, 20, 30])
ax.set_xticks([-4, -2, 0, 2])
  • x、y轴标识
ax.set_xlabel("$x$", fontsize=18)
ax.set_ylabel("$y$", fontsize=18)
  • 图例
ax.legend(loc=0, ncol=3, fontsize=14, frameon=False);
  • 线条:粗细、类型、颜色、标签:ls-line style、 marker-标记,一般是对需要显示的不同标记点、lw-line width、 color-颜色、 label-标签,用于在图例中显示对应内容。
ax.plot(x, y1, lw=1.5, color="blue", label=r"$y(x)$")
ax.plot?

#结果如下
The following format string characters are accepted to control
the line style or marker:
================    ===============================
character           description
================    ===============================
``'-'``             solid line style
``'--'``            dashed line style
``'-.'``            dash-dot line style
``':'``             dotted line style
``'.'``             point marker
``','``             pixel marker
``'o'``             circle marker
``'v'``             triangle_down marker
``'^'``             triangle_up marker
``'<'``             triangle_left marker
``'>'``             triangle_right marker
``'1'``             tri_down marker
``'2'``             tri_up marker
``'3'``             tri_left marker
``'4'``             tri_right marker
``'s'``             square marker
``'p'``             pentagon marker
``'*'``             star marker
``'h'``             hexagon1 marker
``'H'``             hexagon2 marker
``'+'``             plus marker
``'x'``             x marker
``'D'``             diamond marker
``'d'``             thin_diamond marker
``'|'``             vline marker
``'_'``             hline marker
================    ===============================

The following color abbreviations are supported:
==========  ========
character   color
==========  ========
'b'         blue
'g'         green
'r'         red
'c'         cyan
'm'         magenta
'y'         yellow
'k'         black
'w'         white
==========  ========

对应的各种线型和Marker的标示展示 line styles marker_reference1 marker_reference12

  • 辅助线(横线):有两种画法,一种是利用numpy的函数构造出对应的坐标,一种是给出线段的起始点,第二种方法在下面会具体介绍。方法一的好处是直线可以贯穿整个图形,并且根据x轴的取值范围变化。方法二的好处是画线段方便。
ax.plot(x,np.zero_like(x)+1 , color='black',ls ='--',lw=0.5)
ax.plot([0,9],[0.4,0.4],ls='--',lw = 1,color = 'red')
  • 辅助线(竖线与其他直线段):下面代码中第一个[x1,x2]里面都是x坐标,第二个[y1,y2]都是y坐标,画出来的是从(x1,y1)到(x2,y2)的线段。基于这个原理,在图中根据需要画线段变得很简单了。
ax.plot([3,3],[0,5],ls='--',lw = 0.5,color='black')
ax.plot([3,1],[0,5],ls='--',lw = 0.5,color='black')

图表类型

基本的图表类型:

  • 线型图
  • 条状图(bar)
  • 直方图(hist)
  • 散点图(scatter)
  • 饼图
  • 极坐标
  • 雷达图
  • stem
  • errorbar
  • step

看完了是否已经蠢蠢欲动,赶紧探索起来吧。

[完](http://blog.junyu.pro)

声明: 本文转载需标明出处,禁止用于商业目的。

ChangeLog

161203 新建 161205 发布