Matplotlib 简明教程

193

简介

Matplotlib 是 Python 最基础的可视化库,利用它可以绘制出质量很高的各种图形,例如:条形图、盒图、直方图、散点图、饼图等等。在机器学习中,通常使用 Matplotlib 来展现数据,观察数据,从而分析出数据模型。另外,Matplotlib 也是其他更高层 Python 可视化库的底层实现,例如 seaborn 等。
在 API 方面,Matplotlib 提供了一个名为 matplotlib.pyplot 的工具集,该工具集可以让 Matplotlib 像 MATLIB 一样的方式进行绘图。关于 matplotlib.pyplot 的更详细的说明,请参见 官方文档

安装

Matplotlib 是 Python 库,因此你应该已经安装了 Python,如果还没有安装 Python,请参见 Python 官方网站

通过 Python 自带的包管理工具 pip 可以很容易地安装 Matplotlib,只需执行如下的 install 命令即可,这里的 -U 表示如果已经安装了 Matplotlib ,则更新它:

1
pip install -U matplotlib

导入

首先通过 import 语句导入 matplotlib.pyplot:

1
import matplotlib.pyplot as plt

如果是在 juypter notebook 中,则可以使用下面的命令将绘制的图像嵌入到 notebook 里:

1
%matplotlib inline

基本绘图

  • 使用 plot() 函数绘制二维折线图
  • 传入两个数组,分别表示 x 轴方向的取值与 y 轴方向的取值
  • 调用 show() 函数显示图像

示例:

1
2
3
4
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6])
plt.show()

基本绘图

绘制多个线条

可以在一张图里绘制多个线条:

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
for i in (2, 3, 4, 5):
plt.plot(x, i * x)
plt.show()

多个线条

颜色、标记与线型

  • 颜色:顾名思义,就是线条的颜色
  • 标记:用来标记输入的数组中的点
  • 线型:即实线、虚线、点线等

使用 matplotlib.pyplot.plot() 的第三个参数来指定以上三个属性,该参数是一个特殊格式的字符串,如下所示:

1
'[color][marker][line]'

比如,如果要设置颜色为红色(用 r 表示)、标记为上三角形(用 ^ 表示)、线型为虚线(用 -- 表示)的折线图,则该参数为:

1
'r^--'

关于完整的颜色、标记和线型列表,请参见 matplotlib.pyplot.plot 官方文档

上述完整的程序如下:

1
2
3
4
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6], 'r^--')
plt.show()

颜色、标记与线型

可以省略其中的一个或两个属性,比如下面的程序省略了线型:

1
2
3
4
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [3, 5, 6], 'gs')
plt.show()

省略线型

而下面的程序省略了标记:

1
2
3
4
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6], 'r:')
plt.show()

省略标识

如果同时省略线型和标识,则使用默认的线型(直线)而不绘制标记:

1
2
3
4
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6], 'r')
plt.show()

省略线型和标识

标记也可以单独指定:

  • marker 指定标记形状
  • markerfacecolor 指定标记的颜色
  • markersize 指定标记大小
1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 10, 50)
y = np.sin(x)
# 标记为方块(square)、颜色为绿色(green)、大小为10
plt.plot(x, y, 'r', marker='s', markerfacecolor='g', markersize=10)
plt.show()

标记的样式

标题

  • 通过 plt.title() 给图片加上标题
  • fontsize 参数设置字体大小

示例:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import numpy as np

x = [1, 2, 3]
plt.plot(x, x)
plt.title("y=x", fontsize=18)

plt.show()

标题

轴标

  • 通过 plt.xlable()plt.ylabel() 给横坐标轴和纵坐标轴加上标签
  • 通过 fontsize 参数设置字体

示例:

1
2
3
4
5
6
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6])
plt.xlabel("X Label", fontsize=18)
plt.ylabel("Y Label", fontsize=18)
plt.show()

轴标

线宽

通过 linewidth 参数调整线宽:

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
for i in (2, 3, 4, 5):
plt.plot(x, i * x**2, linewidth=i)
plt.show()

设置线宽

子图

  • 通过 matplotlib.pyplot.subplot() 创建一个子图
  • 参数 nrows, ncols, index 表示将整个绘图区视为 nrows x ncols 个区域,当前要绘制到第 index 个区域
  • 三个参数可以写在一起,比如 221 表示 2x2 个区域中的第 1

下面的示例绘制一个两行一列的图组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
y = 2 * x**2

# 将整个画布视为 2x1 的区域,绘制第一个区域
plt.subplot(211)
plt.plot(x, y, 'b')

# 将整个画布视为 2x1 的区域,绘制第二个区域
plt.subplot(212)
plt.plot(x, y, 'r')

plt.show()

两行一列的图组

一个更复杂的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
y = 2 * x**2

# 将整个画布视为 2x3 的区域,绘制第一个区域
plt.subplot(231)
plt.plot(x, -y, 'b')

# 将整个画布视为 2x3 的区域,绘制第三个区域
plt.subplot(233)
plt.plot(x, -y, 'y')

# 将整个画布视为 2x1 的区域,绘制第二个区域
plt.subplot(212)
plt.plot(x, y, 'r')

plt.tight_layout() # 调整子图的间距

plt.show()

更复杂的图组

标注

  • 通过 plt.annotate() 进行标注
  • 参数 xyxytext 表示要标注的点和标注文本所在位置,arrowprops 用来设置标注箭头的属性,fontsize 设置字体大小
1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
y = 2 * x**2
plt.plot(x, y, 'r')
# 标注 (0, 0) 点,标注文本位置在 (0.5, 10),
# 标注的箭头为蓝色,shrink 表示标注箭头距离标注文本的百分比
plt.annotate('(0, 0)', xy=(0, 0), xytext=(0.5, 10),
arrowprops=dict(facecolor='blue', shrink=0.05), fontsize=18)
plt.show()

标注

图例

Matplotlib 中,图例用来描述所绘制的对象,图例由若干个条目组成,每个条目又分为左边的标记和右边的文本,一个典型的图例如下图所示:

图例

Matplotlib 中,通过 legend() 函数绘制图例,它有多种用法,最常用的做法是:

  • 在调用 plt.plot() 时通过指定 label 参数给正在绘制的对象增加标签
  • 通过 plt.legend() 绘制图例,Matplotlib 会根据所有对象的特征和标签自动生成图例条目,进而生成整个图例

legend() 有很多参数,常用的参数有:

  • 通过 loc 参数指定图例的位置,如果取值为 best,则会放置到最合适的位置
  • 通过 fontsize 指定图例中文本的大小

更多 lengend() 的用法,请参见官方文档,同时官方也提供了一篇 Lengend 指南

示例如下:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5)
y = 2 * x**2
plt.plot(x, y, 'r', label="$y = 2x^2$") # 给绘制的对象增加标签,标签内可以使用 LaTeX 语法
plt.legend(loc='best', fontsize=18)
plt.show()

图例

条形图

垂直条形图

使用 bar() 绘制垂直条形图

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.linspace(0, 5, 5)
y = np.random.randint(5, 15, 5)

plt.bar(x, y)
plt.show()

垂直条形图

稍微复杂一点的例子:

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
xs = np.arange(0, 3)
ys = [np.random.randint(1, 10, 3) for i in range(3)]
width=0.2

for i in range(3):
plt.bar(xs + width*i, ys[i], width=width)
plt.show()

垂直条形图-分组

水平条形图

使用 barh() 绘制水平条形图

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.linspace(0, 5, 5)
y = np.random.randint(5, 15, 5)

plt.barh(x, y)
plt.show()

水平条形图

稍微复杂一点的例子(“背靠背”水平条形图):

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
y = np.linspace(0, 5, 5)
x1 = np.random.randint(5, 15, 5)
x2 = np.random.randint(-15, -5, 5)

plt.barh(y, x1, color='g')
plt.barh(y, x2, color='r')
plt.show()

“背靠背”水平条形图

填充图形

使用 fill_between() 填充图形:

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 100)
y = 1 - x**2
plt.fill_between(x, y)
plt.show()

填充图形

填充图形的默认区域是曲线与 x 轴 (y=0) 之间的区域,也可以通过第三个参数来指定任意两条曲线之间的填充区域

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 100)
y1 = 0.1 * x**2 + 0.1
y2 = 0.2 * x**2
plt.fill_between(x, y1, y2, color='red')
plt.show()

填充两曲线图形之间区域

误差棒

通过参数 yerr 指定误差棒:

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.linspace(0, 5, 5)
y = np.random.randint(5, 15, 5)
yerr = np.random.randint(1, 5, 5)
plt.bar(x, y, yerr=yerr)
plt.show()

误差棒

标签和标记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
y = np.linspace(1, 3, 3)
ylabels = ['a', 'b', 'c']
x = np.random.randint(5, 12, 3)
plt.yticks(y, ylabels, fontsize=18)
bars = plt.barh(y, x)
# 绘制垂直线段,第一个参数为横坐标位置,第二个参数和第三个参数表示纵坐标范围
plt.vlines(10, 0.3, max(y) + 0.7, linestyle="--", alpha=0.5)
for i, bar in zip(y, bars):
plt.text(bar.get_width() + 0.1, i - 0.1,
"{0:.0%}".format(bar.get_width()/10), fontsize=14)
plt.xlim(0, 13)
plt.show()

标签和标记

颜色

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import matplotlib.colors as col
import matplotlib.cm as cm
import numpy as np

np.random.seed(42)
x = np.linspace(0, 10, 10)
y = np.random.randint(10, 18, 10)
cmap = cm.ScalarMappable(col.Normalize(min(y),max(y),cm.hot))
plt.bar(x, y, color=cmap.to_rgba(y))
plt.show()

条形图-颜色

填充

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import numpy as np

patterns = ('-', '+', 'x', '\\', '*', 'o', 'O', '.')

x = np.arange(1, len(patterns))

bars = plt.bar(x, x, color='w')

for bar,pattern in zip(bars, patterns):
bar.set_hatch(pattern)
plt.show()

条形图-填充

盒状图

概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import matplotlib.pyplot as plt

x = [14, 15, 16, 16, 17,
17, 17, 17, 17, 18,
18, 18, 18, 18, 18,
19, 19, 19, 20, 20,
20, 20, 20, 20, 21,
21, 22, 23, 24, 24,
29]
plt.figure(figsize=(8, 7))
plt.boxplot(x, showmeans=True, meanprops=dict(marker='+', markeredgecolor='blue'))
plt.hlines(29, 0.79, 1.45, linestyle='dashed', alpha=0.5)
plt.text(0.525, 28.8, 'Outer Fence 29.0', fontsize=13)
plt.hlines(24.5, 0.79, 1.45, linestyle='dashed', alpha=0.5)
plt.text(0.53, 24.3, 'Inner Fence 24.5', fontsize=13)
plt.text(1.055, 23.8, 'Upper Adjacent 24.0', fontsize=13)
plt.text(1.09, 19.8, 'Upper Hinge 20.0', fontsize=13)
plt.text(1.09, 18.8, 'Median 19.0', fontsize=13)
plt.text(1.09, 16.9, 'Lower Hinge 17.0', fontsize=13)
plt.text(1.055, 13.8, 'Lower Adjacent 14.0', fontsize=13)
plt.text(0.6, 19, 'Mean 19.2', fontsize=13)
plt.hlines(19.2, 0.78, 0.98, linestyle='solid', alpha=0.5)
plt.xticks([1], ['X'], fontsize=16)
plt.yticks(fontsize=16)
plt.show()

盒状图概念

Name Formula Value
Upper Hinge 75th Percentile 20
Lower Hinge 25th Percentile 17
H-Spread Upper Hinge - Lower Hinge 3
Step 1.5 x H-Spread 4.5
Upper Inner Fence Upper Hinge + 1 Step 24.5
Lower Inner Fence Lower Hinge - 1 Step 12.5
Upper Outer Fence Upper Hinge + 2 Steps 29
Lower Outer Fence Lower Hinge - 2 Steps 8
Upper Adjacent Largest value below Upper Inner Fence 24
Lower Adjacent Smallest value above Lower Inner Fence 14
Outside Value A value beyond an Inner Fence but not beyond an Outer Fence 29
Far Out Value A value beyond an Outer Fence None

基本画法

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.random.normal(0, 0.1, 100)
plt.boxplot(x)
plt.show()

盒状图-基本画法

参数设置

  • 使用 showmeans 控制是否显示均值
  • 使用 meanprops 设置均值标记的参数
  • 使用 medianprops 设置中位数线段的参数
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.random.normal(0, 0.1, 100)
plt.boxplot(x, showmeans=True,
meanprops=dict(marker='^', markerfacecolor='blue', markeredgecolor='blue'),
medianprops=dict(linewidth=2))
plt.show()

盒状图-参数设置

横向绘制

默认的盒状图是垂直的,也可以使用 vert=False 绘制水平的盒状图:

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
x = np.random.normal(0, 0.1, 100)
plt.boxplot(x, vert=False,
showmeans=True, meanprops=dict(marker='^', markerfacecolor='blue', markeredgecolor='blue'),
medianprops=dict(color='red', linewidth=2))
plt.show()

盒状图-水平

切口盒状图

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
xs = [np.random.normal(0, stddev, 100) for stddev in range(1, 4)]
xlabels = ['x1', 'x2', 'x3']
plt.boxplot(x, notch=True)
plt.xticks(list(range(1, len(xs)+1)), xlabels)
plt.show()

切口盒状图

设置颜色

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
xs = [np.random.normal(0, stddev, 100) for stddev in range(1, 4)]
xlabels = ['x1', 'x2', 'x3']
bplot = plt.boxplot(x, patch_artist=True)
plt.xticks(list(range(1, len(xs)+1)), xlabels)
colors = ['pink','lightblue','lightgreen']
for pathch,color in zip(bplot['boxes'],colors):
pathch.set_facecolor(color)
plt.show()

盒状图-颜色

小提琴图

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
xs = [np.random.normal(0, stddev, 100) for stddev in range(1, 4)]
xlabels = ['x1', 'x2', 'x3']
bplot = plt.violinplot(x)
plt.xticks(list(range(1, len(xs)+1)), xlabels)
plt.show()

小提琴图

直方图

使用 hist() 绘制直方图

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

x = np.random.normal(size=10000)

plt.hist(x, bins=100)
plt.show()

直方图

稍微复杂一点的例子:

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import numpy as np

x1 = np.random.normal(3, 1, size=1000)
x2 = np.random.normal(5, 1, size=1000)
plt.hist(x1, bins=100, alpha=0.8, label='x1')
plt.hist(x2, bins=100, alpha=0.8, label='x2')
plt.legend(fontsize='x-large')
plt.show()

直方图-复杂的例子

散点图

使用 scatter() 绘制散点图

1
2
3
4
5
6
import matplotlib.pyplot as plt
import numpy as np

x = np.random.multivariate_normal([0, 0], [[2, 0], [0, 2]], 300)
plt.scatter(x[:,0], x[:,1])
plt.show()

散点图

稍微复杂一点的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
centers = ([0, 0], [1, 2], [2, 1])
regions = ([[5, 0], [0, 5]],
[[3, 0], [0, 3]],
[[7, 0], [0, 7]])
xs = [np.random.multivariate_normal(centers[i], regions[i], 300)
for i in range(3)]
colors = ['red', 'green', 'blue']
markers = ['^', 'x', '+']
plt.figure(figsize=(8, 6))
for i in range(3):
plt.scatter(xs[i][:,0], xs[i][:,1], alpha=0.8,
color=colors[i],
marker=markers[i])
plt.show()

散点图-复杂的例子

点的标注

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt

xs = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
ys = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
plt.figure(figsize=(8, 6))
plt.scatter(xs, ys, marker='s', s=100)
for x,y in zip(xs, ys):
plt.annotate('(%s,%s)'%(x,y), xy=(x,y), xytext=(0,-21),
textcoords='offset points', ha='center', fontsize=14)
plt.xlim(-0.2, 1.2)
plt.ylim(0.1, 0.9)
plt.show()

散点图-点的标注

点的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
mu_vec1 = np.array([0,0])
cov_mat1 = np.array([[1,0],[0,1]])
x = np.random.multivariate_normal([0, 0], [[2, 0], [0, 2]], 500)
fig = plt.figure(figsize=(8,6))

R = x**2
R_sum = R.sum(axis = 1)

plt.scatter(x[:,0], x[:,1], color='grey', marker='o', s=20*R_sum, alpha=0.5)
plt.show()

散点图-点的大小

3D图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

x = np.arange(-1, 1, 0.02)
y = np.arange(-1, 1, 0.02)
X,Y = np.meshgrid(x,y)
Z = X**2 + Y**2
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
ax.set_zlim(0, 2)
plt.show()

3D图

视角:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

x = np.arange(-1, 1, 0.02)
y = np.arange(-1, 1, 0.02)
X,Y = np.meshgrid(x,y)
Z = X**2 + Y**2
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
ax.set_zlim(0, 2)

ax.view_init(40, 20) # 仰角和方位角

plt.show()

3D图-视角

3D曲线图

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

x = np.sin(np.linspace(-10, 10, 100))
y = np.cos(np.linspace(-10, 10, 100))
z = np.linspace(-10, 10, 100)
ax.plot(x,y,z)
plt.show()

3D曲线图

3D散点图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

np.random.seed(42)

fig = plt.figure()
ax = Axes3D(fig)

xs = [np.random.randint(100, size=100) + 25*i for i in range(2)]
ys = [np.random.randint(100, size=100) for i in range(2)]
zs = [np.random.randint(100, size=100) + 25*i for i in range(2)]
markers = ['x', 'o']
colors = ['r', 'b']

for i in range(2):
ax.scatter(xs[i], ys[i], zs[i], marker=markers[i], c=colors[i])

plt.show()

3D散点图

3D直方图

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

np.random.seed(42)

fig = plt.figure()
ax = Axes3D(fig)

ax.bar([1, 2, 3], [1, 2, 3], zdir='y')
plt.show()

3D直方图

饼状图

1
2
3
4
5
import matplotlib.pyplot as plt

x = [0.53, 0.47]
plt.pie(x)
plt.show()

饼状图

参数设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import matplotlib.pyplot as plt

x = [0.53, 0.47]
explode = [0, 0.05]
labels = ['Male', 'Female']
colors = ['blue', 'purple']
paches, texts, autotexts = plt.pie(x, autopct='%1.1f%%',
explode=explode, labels=labels,
colors=colors)
for text in texts+autotexts:
text.set_fontsize(18)
for text in autotexts:
text.set_color('white')
plt.show()

饼图-参数设置

子图与布局

布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt

ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 1), rowspan=2, colspan=2)

ax1.plot([1, 2, 3], [4, 5, 6])
ax2.plot([1, 2, 3], [4, 2, 3])
ax3.plot([1, 2, 3], [1, 5, 3])
ax4.plot([1, 2, 3], [4, 1, 3])

plt.tight_layout() # 调整子图间距

plt.show()

布局

子图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1,10,1000)
y1 = np.log(x)
y2 = np.sin(x)

fig, ax1 = plt.subplots()

left,bottom,width,height = [0.55, 0.23, 0.3, 0.35]
ax2 = fig.add_axes([left,bottom,width,height])

ax1.plot(x,y1)
ax2.plot(x,y2)
plt.show()

子图

版权声明:本文为原创文章,转载请注明出处。http://cynhard.com/2018/06/03/matplotlib-brief-tutorial/

推荐文章