Matplotlib简介

Matplotlib是一个Python 2D绘图库, 可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据. Matplotlib可用于Python脚本, Python和IPython shell, Jupyter笔记本, Web应用程序服务器和四个图形用户界面工具包.

Matplotlib库的安装

安装Matplotlib库的最快也是最简单的方法是在shell上使用以下命令:
pip install matplotlib
一般使用时直接import即可
import matplotlib.pyplot as plt

matplotblib.pyplot.plot()的使用

注意:
后文将用plt代替matplotblib.pyplot

matplotlib.pyplot 是命令样式函数的集合, 相当于快捷方式. 每个pyplot函数都可以对图形进行一些更改: 例如, 创建图形, 在图形中创建绘图区域,在绘图区域中绘制一些线条,用标签装饰图形等.
在matplotlib.pyplot中, 各种状态在函数调用中保留, 以便跟踪当前图形和绘图区域等内容, 并且绘图函数指向当前轴(请注意此处”轴”是指图形的轴部分, 而不是多个轴的严格数学术语)

plt.plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs) [官方文档]

  • x, y: 点或线节点的坐标
  • fmt: 定义基本格式(如颜色, 标记和线型).
  • …: 可以同时进行多条曲线
  • kwargs: 可选参数, 用于指定曲线特性, 如线标签(用于自动图例), 线宽, 抗锯齿, 标记面颜色等.

使用pyplot生成可视化非常快速:

1
2
3
4
import matplotlib.pyplot as plt
a = [1, 3, 5, 7]
plt.plot(a)
plt.show()

01

您可能想知道为什么x轴的范围是0-3, y轴的范围是1-7. 如果为plot()命令提供单个列表或数组, 则matplotlib假定它是一系列y值, 并自动为您生成x值. 由于python范围以0开头, 因此默认的x向量与y具有相同的长度, 但从0开始. 因此x数据为 [0,1,2,3].

plot() 是一个多功能命令, 将采用任意数量的参数. 例如, 要绘制x与y的关系, 您可以发出命令:

1
2
3
4
5
import matplotlib.pyplot as plt
a = [1, 3, 5, 7]
b = [1, 9, 25, 49]
plt.plot(a, b)
plt.show()

02

fmt的详细介绍

格式字符串由颜色、标记和线的部分组成:

fmt = ‘[color][marker][line]’

每一个参数都是可选的. 如果未提供, 则使用样式循环中的值.
例外情况:如果给出了行, 但没有标记, 则数据将是没有标记的行.

颜色(colors)

支持以下颜色缩写:

字符 颜色 字符 颜色
‘b’ 蓝色 ‘g’ 绿色
‘r’ 红色 ‘c’ 青绿色
‘m’ 洋红色 ‘y’ 黄色
‘k’ 黑色 ‘w’ 白色
‘#008000’ RGB某颜色 ‘0.8’ 灰度值字符串

标记(markers)

字符 描述
‘.’ 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
‘&#124’ vline marker
‘_’ hline marker

曲线风格(line styles)

字符 描述
‘-‘ solid line style
‘–’ dashed line style
‘-.’ dash-dot line style
‘:’ dotted line style

例如:

1
2
3
4
5
'b'    # blue markers with default shape
'ro' # red circles
'g-' # green solid line
'--' # dashed line with default color
'k^:' # black triangle_up markers connected by a dotted line

**kwarg的详细介绍

**kwargs(可选参数)用于指定曲线特性, 下面给出一些可用的曲线特性:

属性 描述
agg_filter a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array
alpha 透明度 float
animated bool
antialiased bool
clip_box Bbox
clip_on bool
clip_path [(Path, Transform) / Patch / None]
color color
contains callable
dash_capstyle {‘butt’, ‘round’, ‘projecting’}
dash_joinstyle {‘miter’, ‘round’, ‘bevel’}
dashes sequence of floats (on/off ink in points) or (None, None)
drawstyle {‘default’, ‘steps’, ‘steps-pre’, ‘steps-mid’, ‘steps-post’}
figure Figure
fillstyle {‘full’, ‘left’, ‘right’, ‘bottom’, ‘top’, ‘none’}
gid str
in_layout bool
label object
linestyle {‘-‘, ‘–’, ‘-.’, ‘:’, ‘’, (offset, on-off-seq), …}
linewidth float
marker unknown
markeredgecolor color
markeredgewidth float
markerfacecolor color
markerfacecoloralt color
markersize float
markevery unknown
path_effects AbstractPathEffect
picker float or callable[[Artist, Event], Tuple[bool, dict]]
pickradius float
rasterized bool or None
sketch_params (scale: float, length: float, randomness: float)
snap bool or None
solid_capstyle {‘butt’, ‘round’, ‘projecting’}
solid_joinstyle {‘miter’, ‘round’, ‘bevel’}
transform matplotlib.transforms.Transform
url str
visible bool
xdata 1D array
ydata 1D array
zorder float

下面给出一些绘图实例:

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

dt = 0.01
t = np.arange(0, 10, dt)
nse = np.random.randn(len(t))
r = np.exp(-t / 0.05)
cnse = np.convolve(nse, r) * dt
cnse = cnse[:len(t)]
s = 0.1 * np.sin(2 * np.pi * t) + cnse
plt.plot(t, s, "k,-.",
t, r, "g1:", markersize=3)
plt.show()

03

matplotblib.pyplot的细节设定

方法 描述
plt.xlabel(xlabel, fontdict=None, labelpad=None, **kwargs) 设置x轴标签
plt.ylabel(ylabel, fontdict=None, labelpad=None, **kwargs) 设置y轴标签
plt.axis([xmin, xmax, ymin, ymax]) 设定当前轴的范围
plt.subplot(nrows, ncols, index) 设定绘图区域

设置标签很容易理解, 而axis([xmin, xmax, ymin, ymax])中的参数为横纵坐标尺度, 如[-1, 10, 0, 6]设定横坐标从-1到10, 纵坐标从0到6. subplot(nrows, ncols, index)则是将整个绘图区域分为nrows个行, ncols个列绘图区; 而index表面当前绘图区域在从左到右从上到下的第index个绘图区.

例如:

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

x1 = np.arange(0, 10, 0.05)
x2 = np.arange(0, 10, 0.08)
y1 = np.exp(x1)
y2 = np.cos(x2 * np.pi)

plt.subplot(2, 1, 1)
plt.plot(x1, y1, "b.-.")
plt.subplot(2, 1, 2)
plt.axis([-5, 15, -2, 2])
plt.plot(x2, y2, "r^-")
plt.show()

结果如图:

04

pyplot的中文显示

关于负号乱码问题, 使用 plt.rcParams['axes.unicode_minus'] = False 即可解决.

第一种方法: 修改全局字体

使用 plt.rcParams 修改全局字体

例如:

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

plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.plot(np.arange(10), np.cos(np.arange(10) * np.pi))
plt.ylabel("纵轴(值)")
plt.savefig('matplotlib05', dpi=600) #保存图片
plt.show()

结果如图:

05

reParams的属性:

属性 描述
‘font.family’ 用于显示字体的名字
‘font.style’ 字体风格, 正常’normal’或斜体’italic’
‘font.size’ 字体大小, 整数字号或者’large’、’x-small’
中文字体 描述
‘SimHei’ 中文黑体
‘Kaiti’ 中文楷体
‘LiSu’ 中文隶书
‘FangSong’ 中文仿宋
‘YouYuan’ 中文幼圆
‘STSong’ 华文宋体

再例如:

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

plt.rcParams['font.family'] = 'STSong'
plt.rcParams['font.size'] = 20
plt.rcParams['axes.unicode_minus']=False
a = np.arange(0, 5, 0.02)
plt.xlabel("时间")
plt.ylabel("振幅")
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()

结果如图:

06

第二种方法: 修改当前字体

在有中文输出的地方, 增加一个属性: fontproperties.
在上一个例子中, 我们可以用第二种方法重写:

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

plt.rcParams['axes.unicode_minus']=False
a = np.arange(0, 5, 0.02)
plt.xlabel("时间", fontproperties = 'STSong', fontsize=20)
plt.ylabel("振幅", fontproperties = 'STSong', fontsize=20)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()

结果和上一个例子是一样的.

这里推荐使用不改变全局变量的情况下修改字体, 即第二种方法, 可以避免一些不必要的错误.