matplotlib学习笔记

matplotlib学习笔记

numpy学习笔记
pandas学习笔记

matplotlib在Python中可以说是非常重要的绘图库,我们使用matplotlib在Python中绘图,就像使用MATLAB绘图一样,效果十分相似。实际上,matplotlib绘图库与MATLAB是十分相像的。

matplotlib中的函数方法非常的多且复杂,在本篇文章中只涉及到一部分本人近期学习的东西,更详细的绘图技巧还需要大家在实际使用中结合文档,不断查阅,积累经验。接下来我会结合一些代码对matplotlib中的一些方法进行解释。

基本使用

首先,我们来看一下matplotlib的基本使用,我们绘制一条简单的曲线。

import matplotlib.pyplot as plt
import numpy as np

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

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

首先,我们要导入matplotlib中的pyplot库。pyplot在matplotlib中是最常用的。
我们首先使用numpy库中的方法生成一些x和y的数据。
然后我们使用pylot库中的plot方法。这个方法用来绘制一条曲线。
pyplot中有许多参数,我只举几个常用的,其他的可以查阅文档:
第一个参数和第二个参数分别是x和y的值;
color是线条的颜色;
marker:线条中点的标记;
markersize:线条中标记的大小;
linewidth:线条的粗细值;
linestyle:线条的风格;
label:线条的标签。
我们会在接下来的例子中逐渐体会这些参数。

使用show函数我们就可以看到我们绘制的图了,值得注意的是,执行到show方法的时候,程序进入阻塞状态,只有当我们关闭展示出来的窗口之后,程序才会继续往下执行。

此外,我们还可以使用savefig方法将绘制的图片自动保存。

接下里我们看一段代码:

import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)

# 设置图表标题,并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

# 设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14)

plt.show()

这段代码运行后的样子:
在这里插入图片描述

我们首先生成了一些x和y的值,然后将他们放入plot中,线条宽度为5.此时我们已经绘制好该线条。
title方法让我们可以设置该图片的标题,第一参数为标题名字,第二个参数是标题字体的大小。
我们用xlabel和ylabel方法设置x轴和y轴的标签,第一个参数是坐标轴显示的标签名,第二个参数是标签名字体的大小。
我们用tick_params来设置刻度标记的大小。

figure

figure函数相当于创建一个画板,然后我们在上面绘制各种各样的函数。

x = np.linspace(-1, 1, 50)
y1 = x ** 2
y2 = x ** 3

# figure1
plt.figure()
plt.plot(x, y1)
# figure2
plt.figure(num=10, figsize=(8,4))
plt.plot(x, y2)

plt.show()

比如说这段代码,我们创建了两个“画板”,然后分别在上面绘制不同的函数,我们还可以用figsize参数调整这个“画板”的大小。

我们也可以在一个figure中绘制多条曲线:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-1, 1, 0.1)
y1 = np.exp(x + 1)
y2 = np.exp(x * 2)
y3 = np.exp(x ** 2)

plt.figure()
# 上背景色
plt.subplot(facecolor='g')
plt.plot(x, y1, color='r', linestyle='--', marker='*', linewidth=1, label='y1')

plt.plot(x, y2, color='b', linestyle='--', marker='*', linewidth=1, label='y2')

plt.plot(x, y3, color='m', linestyle='--', marker='*', linewidth=1, label='y3')

# 添加图例
plt.legend(loc='upper left', bbox_to_anchor=(0.2, 0.95))
# 添加标题
plt.title('figure')
# 添加网格
plt.grid(color='k', linestyle=':')


plt.show()


在这里插入图片描述
在这段代码中,我们只用了一个figure,我们在一个“画板”中绘制了多条曲线。
我们可以使用subplot方法中的参数facecolor来设置背景颜色,我们将其设置为绿色。
之后,我们绘制了三条曲线,在plot函数中使用了许多参数来调整线条。
我们使用legend方法来设置图例,其中loc参数是调整图例的大致位置,bbox_to_anchor是调整该图例更精细的位置。
我们再给该图添加标题和网格,添加网格我们使用grid函数,其中我们使用了颜色和线条风格来设置网格。

坐标轴

我们可以通过一些函数来设置坐标轴。

x = np.linspace(-1, 10, 50)
y1 = x ** 2
y2 = x + 1

plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=2.0, linestyle='--')

# 设置X、Y范围
plt.xlim((-1, 2))
plt.ylim((-2, 3))

# lable说明
plt.xlabel('I am X')
plt.ylabel('I am Y')

# 单位
new_ticks = np.linspace(-1, 2, 5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2, -1.5, -1, 1.22, 3], ['really bad', 'bad', 'normal', 'good', 'really good'])
# 正则表达
plt.yticks([-2, -1.5, -1, 1.22, 3], [r'$really\ bad$', r'$\alpha$', 'normal', 'good', 'really good'])

plt.show()

控制坐标轴范围的方法:
plt.axis([x_min, x_max, y_min, y_max])
如果只是单独想要控制x轴或者y轴的取值,则可以用plt.xlim(x_min, x_max)和plt.ylim(y_min, y_max),用法与plt.axis()类似。

坐标轴间隔的设定:
函数plt.xticks()和plt.xticks()用来实现对x轴和y轴坐标间隔(也就是轴记号)的设定。用法上,函数的输入是两个列表,第一个表示取值,第二个表示标记。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 2, 50)
y1 = x ** 2
y2 = 3 * x + 1

fig = plt.figure()
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--', marker='*', label='y1')
plt.plot(x, y2, color='green', linewidth=1.0, linestyle='-', marker='*', label='y2')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend(loc='best')

new_ticks = np.linspace(-2, 2, 10)
plt.xticks(new_ticks)
plt.yticks([0, 1, 2], [r'$low$', r'$normal$', r'$high$'])

plt.show()

在这里插入图片描述

文字注释

plt.text(), plt.annotate()是两种向图像添加文本注释的方法。plt.text()可以在图像任意位置添加文字,plt.annotate()则可以帮助我们形象地为曲线中的某一个点添加注释。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-1, 1, 0.1)

y1 = np.exp(x)
y2 = np.exp(2 * x)

plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1)
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1)

plt.text(-0.5, 3, "exp functions", fontsize=10)

plt.show()

在这里插入图片描述
plt.text()中前两个参数表示添加文字的坐标位置,最后一个参数是要添加的文本。

plt.annotate()与plt.text()类似,代码表示如下:

plt.annotate('A', xy=(0, 1), xytext=(-0.5, 2.5), arrowprops=dict(facecolor='k', headwidth=10, width=2))

在这里插入图片描述

第一个参数’A’是注释文本,xy表示要注释的点的坐标,xytext表示注释文本的起始坐标,arrowprops表示箭头,我们可以通过一个字典形的变量,设置其样式,包括颜色,宽度等等(headwidth表示箭头宽度,width表示箭身的宽度)。

可见度

我们可以通过对标签的背景设置来设置标签的可见度。

for label in ax.get_xticklabels() + ax.get_yticklabels():
    # 大小
    label.set_fontsize(12)
    # 背景
    label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.5))

例如这段代码,使用ax = plt.gca()来获取axis。我们使用其中的get_xticklabels方法和get_yticklabels方法就可以获取x和y轴的所有标签。然后我们使用set_fontsize方法来设置标签的大小。用set_bbox方法来设置标签的背景。其中要传入一个元组,facecolor是背景颜色,edgecolor是边框颜色,alpha是透明度设置。

散点图

我们用scatter方法来绘制散点图。

import matplotlib.pyplot as plt
import numpy as np

n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X)  # for color value

plt.scatter(X, Y, s=75, c=T, alpha=0.5)
plt.show()


在这里插入图片描述

柱状图

我们用bar函数来绘制柱状图。

import matplotlib.pyplot as plt
import numpy as np

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

plt.xlim(- .5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

for x, y in zip(X, Y1):
    plt.text(x + 0, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    plt.text(x + 0, -y - 0.05, '%.2f' % y, ha='center', va='top')

plt.show()

在这里插入图片描述
我们先生成一些x和y的数据,我们要把柱状图画成上下两边共24条。
然后我们用bar函数将x和y传进去并设置一些参数,上下柱状图我们分开来画。上面的y为正,下面的为负。
然后我们对x和y轴进行设置。
然后我们用for循环在每一个柱子上面添加注释,该注释为y的值。同样的,上面的柱子和下面的柱子我们分开来注释。

等高线图

我们用contour函数来绘制等高线。

import matplotlib.pyplot as plt
import numpy as np


def f(x, y):
    # the height function
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)


n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# 定义网格
X, Y = np.meshgrid(x, y)

# 根据高度,分成8份
plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)

# 画等高线
C = plt.contour(X, Y, f(X, Y), colors='black', linewidths=0.5)

# 加标签
plt.clabel(C, inline=True, fontsize=10)

plt.xticks(())
plt.yticks(())
plt.show()




在这里插入图片描述
我们先定义一个函数来生成x,y对应的z值。
然后我们用meshgrid函数来生成网格,返回新的X和Y。
然后我们使用contourf函数,将X,Y,Z的参数传进去,并设定我们要将该图分为多少份,并设置透明度和颜色(这里我设置颜色为hot,也可以设置为cool,设置为cool的效果如下)。
在这里插入图片描述
我们用contour函数来画等高线。
并用clabel函数来设置等高线上的注释,inline参数为True表示我们将注释嵌入等高线里。

图像

import matplotlib.pyplot as plt
import numpy as np

# image data
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3, 3)

"""
for the value of "interpolation", check this:
http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html
for the value of "origin"= ['upper', 'lower'], check this:
http://matplotlib.org/examples/pylab_examples/image_origin.html
"""

plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
plt.colorbar(shrink=.95)

plt.xticks(())
plt.yticks(())

plt.show()

在这里插入图片描述
我们先生成一个3 * 3的矩阵,然后用imshow方法将其变为图像,用colorbar方法绘制图像旁边的图例。

3D图像

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

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

# X, Y value
x = np.arange(-4, 4, 0.25)
y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X ** 2 + Y ** 2)
# height value
Z = np.sin(R)

# 3D图像
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.get_cmap('rainbow'))

# 等高线
# zdir表示投影的平面,offset位置
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.get_cmap('rainbow'))
ax.set_zlim(-2, 2)

plt.show()

在这里插入图片描述
我们要绘制3D图像,需要导入mpl_toolkits.mplot3d库中的Axe3D。
之后我们获取figure对象,将其传入Axe3D中,保存在参数ax中。
我们生成一些x和y数据并定义网格。
我们根据X和Y的值计算Z的值。
我们调用Axes3D中的plot_surface方法来绘制3D图像;然后用contour函数来绘制图像中的等高线(我们设置投影在z轴,投影刻度为-2);最后我们用set_zlim来设置z轴的范围。

使用subplot创建多子图

创建多子图的方法有许多种,接下来放几个例子,例子中函数的参数比较难以理解,需要亲身实践去学习。
法一:

import matplotlib.pyplot as plt

plt.figure()

plt.subplot(2, 2, 1)
plt.plot([0, 1], [0, 1])

plt.subplot(2, 2, 2)
plt.plot([0, 1], [0, 2])

plt.subplot(2, 2, 3)
plt.plot([0, 1], [0, 3])

plt.subplot(2, 2, 4)
plt.plot([0, 1], [0, 4])

plt.show()

在这里插入图片描述

import matplotlib.pyplot as plt

plt.figure()

plt.subplot(2, 1, 1)
plt.plot([0, 1], [0, 1])

plt.subplot(2, 3, 4)
plt.plot([0, 1], [0, 2])

plt.subplot(2, 3, 5)
plt.plot([0, 1], [0, 3])

plt.subplot(2, 3, 6)
plt.plot([0, 1], [0, 4])

plt.show()


在这里插入图片描述

法二:

import matplotlib.pyplot as plt

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

ax1.plot([0, 1], [0, 1])
ax1.set_title('ax1')

ax4.scatter([0, 1], [0, 3])
ax4.set_xlabel('ax4_x')
ax4.set_xlabel('ax4_y')

plt.show()

在这里插入图片描述
法三:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure()
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :2])
ax3 = plt.subplot(gs[1:, 2])
ax4 = plt.subplot(gs[-1, 0])
ax5 = plt.subplot(gs[-1, -2])

plt.show()

在这里插入图片描述
法四:

import matplotlib.pyplot as plt

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey=True)

plt.show()

在这里插入图片描述

画中画

我们可以在一幅图标中绘制其他图标。

import matplotlib.pyplot as plt

fig = plt.figure()
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]

# below are all percentage
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_title('ax1')
ax1.set_xlabel('ax1_x')
ax1.set_ylabel('ax1_y')

ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25])  # inside axes
ax2.plot(y, x, 'b')
ax2.set_title('ax2')
ax2.set_xlabel('ax2_x')
ax2.set_ylabel('ax2_y')

# different method to add axes
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1], x, 'g')
plt.title('ax3')
plt.xlabel('ax3_x')
plt.ylabel('ax3_y')

plt.show()

在这里插入图片描述

镜像坐标轴

我们使用twinx或者twiny函数来获取镜像的x或y轴。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
y1 = 0.05 * x ** 2
y2 = -1 * y1

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()  # mirror the ax1
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b--')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.set_ylabel('Y2 data', color='b')

plt.show()

在这里插入图片描述

动画

我们使用animation来做动图。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig, ax = plt.subplots()

x = np.arange(0, 2 * np.pi, 0.01)
line, = ax.plot(x, np.sin(x))


def animate(i):
    line.set_ydata(np.sin(x + i / 10.0))  # update the data
    return line,


# Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.sin(x))
    return line,


# call the animator.  blit=True means only re-draw the parts that have changed.
# blit=True dose not work on Mac, set blit=False
# interval= update frequency
ani = animation.FuncAnimation(fig=fig, func=animate, frames=100, init_func=init,
                              interval=20, blit=False)

# save the animation as an mp4.  This requires ffmpeg or mencoder to be
# installed.  The extra_args ensure that the x264 codec is used, so that
# the video can be embedded in html5.  You may need to adjust this for
# your system: for more information, see
# http://matplotlib.sourceforge.net/api/animation_api.html
# anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])

plt.show()

本文对matplotlib的介绍十分有限,有些功能只是给出了例子。有些函数的参数十分复杂,需要读者自己查阅文档来理解。
关于matplotlib绘图,我在本篇博客中先总结这么多。当然,matplotlib的学习需要大量的实践。希望大家能在实践中不断学习,不断积累。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值