1 几个小例子

最简单的图表应该就是一个函数图像 1 简单折线图 Simple Line Plots - 图1.
首先 import 库,并且设置绘图的样式:

  1. %matplotlib inline
  2. import matplotlib.pyplot as plt
  3. plt.style.use('seaborn-whitegrid')
  4. import numpy as np

首先创建图像 ( figure ) 和坐标轴 ( axes ):

  1. fig = plt.figure()
  2. ax = plt.axes()

在 notebook 中执行后,会自动嵌入下面的图像:
image.png
在 Matplotlib 中, figure ( 类 plt.Figure 的一个实例 ) 可以认为就是一个容器 ( container ),这个容器里面装有所有绘制坐标中、曲线、标签等的对象。 axes ( 类 plt.Axes 的一个实例 ) 包括:坐标轴的刻度、标题。

然后就可以使用下面的命令进行绘图啦:

  1. fig = plt.figure()
  2. ax = plt.axes()
  3. x = np.linspace(0 ,10, 100)
  4. ax.plot(x, np.sin(x))

画出来的图张这个熊样(bushi):
image.png

如果想在一幅图像中画多条曲线,那么就多次调用 plt.plot() 就可以啦:

  1. plt.plot(x, np.sin(x))
  2. plt.plt(x, np.cos(x))

image.png

2 修饰图表:曲线的颜色与样式

plt.plot() 函数中,使用形参 color 可以修改曲线的颜色:

  1. plt.plot(x, np.sin(x - 0), color='blue') # specify color by name
  2. plt.plot(x, np.sin(x - 1), color='g') # short colro code (rgbcmyk)
  3. plt.plot(x, np.sin(x - 2), color='0.75') # Grayscale between 0 and 1
  4. plt.plot(x, np.sin(x - 3), color='#FFDD44') # Hex code (RRGGBB from 00 to FF)
  5. plt.plot(x, np.sin(x - 4), color=(1.0, 0.2, 0.3)) # RGB tuple, values 0 to 1
  6. plt.plot(x, np.sin(x - 5), color='chartreuse') # all HTML color names supported

image.png

如果没有指定曲线的颜色,Matplotlib 会自动从默认的颜色集中选择。

同样,曲线的样式可以通过 plt.plot() 函数中的形参 linestyle 来指定:

  1. plt.plot(x, x + 0, linestyle='solid')
  2. plt.plot(x, x + 1, linestyle='dashed')
  3. plt.plot(x, x + 2, linestyle='dashdot')
  4. plt.plot(x, x + 3, linestyle='dotted')
  5. # For short, you can use the following codes:
  6. plt.plot(x, x + 4, linestyle='-')
  7. plt.plot(x, x + 5, linestyle='--')
  8. plt.plot(x, x + 6, linestyle='-.')
  9. plt.plot(x, x + 7, linestyle=':')

image.png

当然,如果你还嫌麻烦,可以将 linestylecolor 合并:

  1. plt.plot(x, x + 0, '-g') # solid green
  2. plt.plot(x, x + 1, '--c') # dashed cyan
  3. plt.plot(x, x + 2, '-.k') # dashdot black
  4. plt.plot(x, x + 3, ':r'); # dotted red

image.png
当然,在 plt.plot() 中还有很多别的关键字,好好查查吧!

3 修饰图表:坐标轴范围

(按照原作者的话 “Matplotlib does a decent job for choosing default axes limits for your plot”, decent 用的好呀!

最基本的方法我们可以使用 plt.xlim()plt.ylim() 方法来修改坐标轴的范围:

  1. plt.plot(x, np.sin(x))
  2. plt.xlim(-1, 11)
  3. plt.ylim(-1.5, 1.5)

image.png

可以看到, plt.xlim()plt.ylim() 都是左闭右闭的区间,这与 Python 内置左闭右开的风格不大一样(比如 range() 就是左闭右开的区间。

这玩意也可以用来将坐标轴倒置:

  1. plt.plot(x, np.sin(x))
  2. plt.xlim(10, 0)
  3. plt.ylim(1.2, -1.2);

image.png

另外一种方法是使用 plt.axis()注意:这里是 axis() ,不是 axes() )。通过传入 [xmin, xmax, ymin, ymax] 这样的 list ,就可以一步到胃:

  1. plt.plot(x, np.sin(x))
  2. plt.axis([-1, 11, -1.5, 1.5])

image.png

当然, plt.axis() 还有更强大的功能!比如可以通过下面的代码让曲线的界限变得紧凑:

  1. plt.plot(x, np.sin(x))
  2. plt.axis('tight')

image.png

也可以通过下面的代码让 x 轴和 y 轴的单位长度相等:

  1. plt.plot(x, np.sin(x))
  2. plt.axis('equal');

image.png

4 加入标签 Labeling Plots

这一小节包括:图表的标题、坐标轴的标签以及简单的图例。

首先是坐标轴的标签:

  1. plt.plot(x, np.sin(x))
  2. plt.title("A Sine Curve")
  3. plt.xlabel("x")
  4. plt.ylabel("sin(x)")

image.png
关于标题和标签的位置、大小以及样式,都可以通过向上面这三个函数传递不同的参数值来修改。具体可以查看Matplotlib 的官方文档

当一个图像上有多条曲线的时候,我们就可以创建图例来更好的展示图表。 plt.legend() 可以创建图例,图例中曲线的名字可以通过向 plt.plot() 中传递 label 参数进行修改:

  1. plt.plot(x, np.sin(x), '-g', label='sin(x)')
  2. plt.plot(x, np.cos(x), ':b', label='cos(x)')
  3. plt.axis('equal')
  4. plt.legend()

image.png

关于图例的更多高级的使用方法,在第 6 章自定义图例中进行讲解。

5 Matplotlib 的小陷阱

原文的标题为 “Aside: Matplotlib Gotchas”.

虽然绝大多数 plt 中 的函数被直接翻译成 ax 中的方法,比如plt.plot()ax.plot(), plt.legend()ax.legend() . 但是也有一些不大一样的,这是个坑:

  • plt.xlabel()ax.set_xlabel()
  • plt.ylabel()ax.set_ylabel()
  • plt.xlim()ax.set_xlim()
  • plt.ylim()ax.set_ylim()
  • plt.title()ax.set_title()


在面向对象的接口中,我们一般不单独使用这些方法,取而代之的是使用 ax.set() 方法来设置这些参数:

  1. ax = plt.axes()
  2. ax.plot(x, np.sin(x))
  3. ax.set(xlim=(0, 10), ylim=(-2, 2),
  4. xlabel='x', ylabel='sin(x)',
  5. title='A Simple Plot')

image.png