likes
comments
collection
share

绘图库matplotlib基础使用

作者站长头像
站长
· 阅读数 3

matplotlib基础

python经典绘图库,用于处理数据画图

Matplotlib可以使用各种后端图形库(如Tk、wxPython等)输出图形。使用命令行运行python时,图形通常显示在单独的窗口中。

导入依赖:

import matplotlib

在Jupyter中,可以通过运行%matplotlib inline magic命令简单地在笔记本中输出图形。

%matplotlib inline
# matplotlib.use("TKAgg")  # use this instead in your program if you want to use Tk as your graphics backend.

基础绘图x-y

plot()与show()

plot函数绘制数据,show函数进行展示

如果给“plot”函数一个数组,它将使用该数组作为纵轴上的坐标,而使用数组中每个数据点的索引作为横轴坐标

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

绘图库matplotlib基础使用

还可以提供两个数组:一个用于横轴“x”,另一个用于纵轴“y”:

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

绘图库matplotlib基础使用

限定范围axis()

axis函数用于限定x轴与y轴的范围

x轴与y轴会自动匹配数据的范围。限定边界范围需要调用'axis'函数来更改每个轴的范围

需传递数组[xmin,xmax,ymin,ymax]

plt.plot([-3, -2, 5, 0], [1, 6, 4, 3])
plt.axis([-4, 6, 0, 7])
plt.show()

绘图库matplotlib基础使用

绘制数学函数

numpy的linspace()

基础绘图绘制点坐标系(x,y)(x,y)(x,y),绘制曲线等数学函数则需要使用numpy库生成连续多个数据点在传递给plot进行绘制

import numpy as np
x = np.linspace(-2, 2, 500)
y = x**2

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

让我们画一个数学函数,使用NumPy的linspace函数创建一个数组'x',其中包含500个从-2到2的浮点数,然后创建第二个数组'y',计算为'x'的平方

绘图库matplotlib基础使用

添加标题与标签

title()、xlabel()、ylabel()与grid()

  • title()用于添加图名称
  • xlabel()与ylabel()用于提示x轴与y轴标识
  • grid()用于设置背景是否用表格绘制
plt.plot(x, y)
plt.title("Square function")
plt.xlabel("x")
plt.ylabel("y = x**2")
plt.grid(True)
plt.show()

绘图库matplotlib基础使用

样式

默认绘图方式

默认情况下,matplotlib会对给定的(x,y)(x,y)(x,y)进行连接绘图,也就是数据点[a,b,c,a]会按照a−>b−>c−>aa->b->c->aa>b>c>a方式连续绘制

plt.plot([0, 100, 100, 0, 0, 100, 50, 0, 100], [0, 0, 100, 100, 0, 100, 130, 100, 0])
plt.axis([-10, 110, -10, 140])
plt.show()

绘图库matplotlib基础使用

plot()的第三个参数

绘图时,可以传递第三个参数来更改线条的样式和颜色。通过x1, y1, [style1], x2, y2, [style2], ...这种方式指定数据点数组的风格

例如,“g--”表示“绿色虚线”r表示红色、-表示实线

plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-", [0, 100, 50, 0, 100], [0, 100, 130, 100, 0], "g--")
plt.axis([-10, 110, -10, 140])
plt.show()

绘图库matplotlib基础使用

另外一种方式,在show前调用多次plot(装载数据,设置样式)

plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-")
plt.plot([0, 100, 50, 0, 100], [0, 100, 130, 100, 0], "g--")
plt.axis([-10, 110, -10, 140])
plt.show()

只绘制点而非线

也可以绘制简单的点而不是线。下面是一个带有绿色虚线、红色虚线和蓝色三角形的示例。可以查看matplotlib文档查看样式和颜色选项的完整列表。

x = np.linspace(-1.4, 1.4, 30)
plt.plot(x, x, 'g--', x, x**2, 'r:', x, x**3, 'b^')#blue ^代表三角形
plt.show()

绘图库matplotlib基础使用

plot()的返回值

设置样式

plot函数返回“Line2D”对象列表(每行一个)。可以在这些线上设置额外属性,例如线宽、虚线样式或alpha级别。参考文档:line样式

x = np.linspace(-1.4, 1.4, 30)
line1, line2, line3 = plt.plot(x, x, 'g--', x, x**2, 'r:', x, x**3, 'b^')
line1.set_linewidth(3.0)
line1.set_dash_capstyle("round")
line3.set_alpha(0.2)
plt.show()

绘图库matplotlib基础使用

保存图片

savefig()

savefig()函数用于保存图片

x = np.linspace(-1.4, 1.4, 30)
plt.plot(x, x**2)
plt.savefig("my_square_function.png", transparent=True)

绘制多个图形Subplots

subplot()

matplotlib图可能包含多个子图。这些子地块组织在一个网格中。要创建子图,只需调用subplot函数,并指定图中的行数和列数,以及要绘制的子图的索引(从1开始,然后从左到右,从上到下)。

plt.subplot(2, 2, 1) 可以简写为plt.subplot(221)

x = np.linspace(-1.4, 1.4, 30)
plt.subplot(2, 2, 1)  # 2 rows, 2 columns, 1st subplot = top left
plt.plot(x, x)
plt.subplot(2, 2, 2)  # 2 rows, 2 columns, 2nd subplot = top right
plt.plot(x, x**2)
plt.subplot(2, 2, 3)  # 2 rows, 2 columns, 3rd subplot = bottow left
plt.plot(x, x**3)
plt.subplot(2, 2, 4)  # 2 rows, 2 columns, 4th subplot = bottom right
plt.plot(x, x**4)
plt.show()

绘图库matplotlib基础使用

需要注意行列的概念、这里的行列代表使用几行几列来进行分割

plt.subplot(2, 2, 1)  # 2 rows, 2 columns, 1st subplot = top left
plt.plot(x, x)
plt.subplot(2, 2, 2)  # 2 rows, 2 columns, 2nd subplot = top right
plt.plot(x, x**2)
plt.subplot(2, 1, 2)  # 2 rows, *1* column, 2nd subplot = bottom
plt.plot(x, x**3)
plt.show()

绘图库matplotlib基础使用

上面的1列并不是占据固定大小的1列,而是占据整个图中的1列

subplot2grid()

如果需要更复杂的子地块定位,可以使用subplot2grid而不是subplot。指定网格中的行数和列数,然后指定子块在该网格中的位置(左上=(0,0)),以及子地块跨越的行数和/或列数(可选)。例如:

#3row 3col,从00开始,占据2row 2col
plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2)
plt.plot(x, x**2)
plt.subplot2grid((3,3), (0, 2))
plt.plot(x, x**3)
plt.subplot2grid((3,3), (1, 2), rowspan=2)
plt.plot(x, x**4)
plt.subplot2grid((3,3), (2, 0), colspan=2)
plt.plot(x, x**5)
plt.show()

绘图库matplotlib基础使用

figure()

可以指定多个绘图。每个图可能包含一个或多个子图。默认情况下,matplotlib会自动创建图1。可以随时进行切换

x = np.linspace(-1.4, 1.4, 30)

plt.figure(1)
plt.subplot(211)//2 row 1 col
plt.plot(x, x**2)
plt.title("Square and Cube")
plt.subplot(212)
plt.plot(x, x**3)

plt.figure(2, figsize=(10, 5))
plt.subplot(121)// 1 row 2 col
plt.plot(x, x**4)
plt.title("y = x**4")
plt.subplot(122)
plt.plot(x, x**5)
plt.title("y = x**5")

plt.figure(1)      # back to figure 1, current subplot is 212 (bottom)
plt.plot(x, -x**3, "r:")

plt.show()

绘图库matplotlib基础使用

subplots()的返回值

调用subplots()隐式创建一个图表与子图,返回一个图表对象和多个子图对象(根据参数决定,如subplots(2,1)两行1列返回上下两个图),根据返回的子图对象绘制线调整样式

x = np.linspace(-2, 2, 200)
fig1, (ax_top, ax_bottom) = plt.subplots(2, 1, sharex=True)
fig1.set_size_inches(10,5)
line1, line2 = ax_top.plot(x, np.sin(3*x**2), "r-", x, np.cos(5*x**2), "b-")
line3, = ax_bottom.plot(x, np.sin(3*x), "r-")
ax_top.grid(True)

fig2, ax = plt.subplots(1, 1)
ax.plot(x, x**2)
plt.show()

绘图库matplotlib基础使用

绘制文本

text()

text()用于在图形任意位置绘制文本并设置属性。只需指定水平和垂直坐标以及文本,还可以选择指定一些额外的属性。matplotlib中的任何文本都可以包含TeX方程表达式,请参见文档

x = np.linspace(-1.5, 1.5, 30)
px = 0.8
py = px**2

plt.plot(x, x**2, "b-", px, py, "ro")

plt.text(0, 1.5, "Square function\n$y = x^2$", fontsize=20, color='blue', horizontalalignment="center")
//ha是horizontalalignment缩写
plt.text(px - 0.08, py, "Beautiful point", ha="right", weight="heavy")
plt.text(px, py, "x = %0.2f\ny = %0.2f"%(px, py), rotation=50, color='gray')

plt.show()

绘图库matplotlib基础使用

文本标注annotate()

对图形的元素进行注释是非常常见的,例如上面的漂亮点。annotate函数使这变得很容易:只需指示感兴趣点的位置和文本的位置,还可以选择为文本和箭头添加一些额外的属性。

plt.plot(x, x**2, px, py, "ro")
plt.annotate("Beautiful point", xy=(px, py), xytext=(px-1.3,py+0.5),
                           color="green", weight="heavy", fontsize=14,
                           arrowprops={"facecolor": "lightgreen"})
plt.show()

绘图库matplotlib基础使用

图例legend()

可以配合plot()中的参数label使用说明图形中的图例,图例的位置可以通过关键字参数loc(location)指定。

x = np.linspace(-1.4, 1.4, 50)
plt.plot(x, x**2, "r--", label="Square function")
plt.plot(x, x**3, "g-", label="Cube function")
plt.legend(loc="best")
plt.grid(True)
plt.show()

绘图库matplotlib基础使用

非线性比例

yscale()

对于x轴与y轴的刻度支持非线性比例,如指数级与对数级

x = np.linspace(0.1, 15, 500)
y = x**3/np.exp(2*x)

plt.figure(1)
plt.plot(x, y)
plt.yscale('linear')//线性
plt.title('linear')
plt.grid(True)

plt.figure(2)
plt.plot(x, y)
plt.yscale('log')//指数
plt.title('log')
plt.grid(True)

plt.figure(3)
plt.plot(x, y)
plt.yscale('logit')//对数
plt.title('logit')
plt.grid(True)

plt.figure(4)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)

plt.show()

绘图库matplotlib基础使用

控制x轴与y轴刻度

图/子图plot()绘制的返回对象有xaxisyaxis两个属性,通过这两个属性可以指定刻度范围

x = np.linspace(-2, 2, 100)

plt.figure(1, figsize=(15,10))
plt.subplot(131)
plt.plot(x, x**3)
plt.grid(True)
plt.title("Default ticks")

ax = plt.subplot(132)
plt.plot(x, x**3)
ax.xaxis.set_ticks(np.arange(-2, 2, 1))
plt.grid(True)
plt.title("Manual ticks on the x-axis")

ax = plt.subplot(133)
plt.plot(x, x**3)
plt.minorticks_on()
ax.tick_params(axis='x', which='minor', bottom=False)
ax.xaxis.set_ticks([-2, 0, 1, 2])
ax.yaxis.set_ticks(np.arange(-5, 5, 1))
ax.yaxis.set_ticklabels(["min", -4, -3, -2, -1, 0, 1, 2, 3, "max"])
plt.title("Manual ticks and tick labels\n(plus minor ticks) on the y-axis")


plt.grid(True)

plt.show()

绘图库matplotlib基础使用

散点图

scatter()

传递x数组与y数组参数,scatter()绘制出散点图

from numpy.random import rand
x, y = rand(2, 100)
plt.scatter(x, y)
plt.show()

绘图库matplotlib基础使用

指定散点大小

在scatter()中指定s(scale)数组来指定散点大小

x, y, scale = rand(3, 100)
scale = 500 * scale ** 5
plt.scatter(x, y, s=scale)
plt.show()

绘图库matplotlib基础使用

直方图

hist()

频率直方图,最简单的给定原始数据集绘制出频率直方图

data = [1, 1.1, 1.8, 2, 2.1, 3.2, 3, 3, 3, 3]
plt.subplot(211)
plt.hist(data, bins = 10, rwidth=0.8)//区间十等分

plt.subplot(212)
plt.hist(data, bins = [1, 1.5, 2, 2.5, 3], rwidth=0.95)
plt.xlabel("Value")
plt.ylabel("Frequency")

plt.show()

参数bins指定直方图中的区间个数,直接传数值表示按照data中的元素个数进行多少个等分

绘图库matplotlib基础使用

常用的属性有:

  • color,指定柱子的填充色
  • edgecolor, 指定柱子边框的颜色
  • density,指定柱子高度对应的信息,有数值和频率两种选择
  • orientation,指定柱子的方向,有水平和垂直两个方向
  • histtype,绘图的类型
data1 = np.random.randn(400)
data2 = np.random.randn(500) + 3
data3 = np.random.randn(450) + 6
data4a = np.random.randn(200) + 9
data4b = np.random.randn(100) + 10

plt.hist(data1, bins=5, color='g', alpha=0.75, label='bar hist') # default histtype='bar'
plt.hist(data2, color='b', alpha=0.65, histtype='stepfilled', label='stepfilled hist')
plt.hist(data3, color='r', histtype='step', label='step hist')
plt.hist((data4a, data4b), color=('r','m'), alpha=0.55, histtype='barstacked', label=('barstacked a', 'barstacked b'))

plt.xlabel("Value")
plt.ylabel("Frequency")
plt.legend()
plt.grid(True)
plt.show()

绘图库matplotlib基础使用

读取图片

imread()与imshow()

在matplotlib中读取、生成和打印图像非常简单。

要读取图像,只需导入matplotlib.image模块,并调用其imread函数,将文件名(或文件对象)传递给它。这将以NumPy数组的形式返回图像数据。

import matplotlib.image as mpimg

img = mpimg.imread('my_square_function.png')
print(img.shape, img.dtype)

我们已加载一个288x432图像。每个像素由一个4元素数组表示:红色、绿色、蓝色和alpha级别,存储为0到1之间的32位浮点。返回的是numpy数组,直接调用imshow()绘制即可

plt.imshow(img)
plt.show()

绘图库matplotlib基础使用

调用axis()可以隐藏自动加上的轴

plt.imshow(img)
plt.axis('off')
plt.show()

绘图库matplotlib基础使用

生成图片同理,需要给定numpy数组,可以不指定rgb值,imshow函数会自动将值映射到颜色渐变。默认情况下,颜色渐变从蓝色(低值)变为红色(高值)

img = np.arange(100*100).reshape(100, 100)
print(img)
plt.imshow(img)
plt.show()

绘图库matplotlib基础使用

三维投影

绘制三维图形非常简单。需要导入Axes3D,它注册了3d投影。然后创建一个子地块,将“投影”设置为“3d”,返回一个“Axes3DSubplot”对象,可以使用该对象调用plot_surface,给出x、y和z坐标以及可选属性。

from mpl_toolkits.mplot3d import Axes3D

x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

figure = plt.figure(1, figsize = (12, 4))
subplot3d = plt.subplot(111, projection='3d')
surface = subplot3d.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=matplotlib.cm.coolwarm, linewidth=0.1)
plt.show()

绘图库matplotlib基础使用

也可以通过contourf简单绘制投影

plt.contourf(X, Y, Z, cmap=matplotlib.cm.coolwarm)
plt.colorbar()
plt.show()

内容来源

  1. Sklearn 与 TensorFlow 机器学习实用指南第二版
  2. github.com/ageron/hand…