通过Matplotlib画sin(x)

《Python程序设计与科学计算》中的一些笔记。

1.初始绘制

通过np.linspace生成一个等差数列。为了使曲线变得平滑,在[0,2π]的区间内生成256个数据,生成的图像如图1所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.plot(x, y)
plt.show()

在这里插入图片描述

2.调整刻度

由于图像没有显示三角函数关键坐标点的坐标,所以当前刻度不理想。通过xticks与yticks分别设置图像,使图像只显示设置的刻度,如图2所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.xticks([0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi])
plt.yticks([-1, 0, +1])
plt.plot(x, y)
plt.show()

在这里插入图片描述
由图2可知,虽然通过xticks与yticks将图像的坐标显示了关键数值,但是由于三角函数的特性,如果直接用π来对x轴进行标记会更好,目前毕竟不够精度。在设置标记的时候,可以同时使用LaTex形式进行坐标刻度的标签标记,如图3所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.xticks([0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi], ['$0$', '$\pi/2$', '$\pi$', r'$3\pi/2$', r'$2\pi$'])
plt.yticks([-1, 0, +1], ['$-1$', '$0$', '$+1$'])
plt.plot(x, y)
plt.show()

在这里插入图片描述

3.设置坐标上下限

通过对xlim(xmin,xmax)、ylim(xmin,xmax)进行设置,同样可以限定x轴、y轴的上限和下限。指定x轴坐标范围为[-2,8],y轴的坐标范围为[-1,1],如图4所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.xlim(-2, 8)
plt.ylim(-1.0, 1.0)
plt.plot(x, y)
plt.show()

在这里插入图片描述

4.改变图像基本属性

图像的基本属性包含像素、分辨率、大小、颜色、位深、色调、饱和度、亮度、色彩、通道、图像的层次等。Matplotlib可以对图像的基本属性进行更改,结果如图5所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.plot(x, y, color='red', linewidth=4, marker='+', linestyle='-.', label='sin')
plt.legend(loc='upper left', frameon=False)
plt.plot(x, y)
plt.show()

在这里插入图片描述

图像属性中的参数color表示颜色;
linewidth表示曲线宽度;
marker表示点型;
linestyle表示线性;
label表示图例。
图5中设置的linewidth为4,曲线变粗。设置的点型为“+”,默认是圆。 线型(linestyle)为点划线形式,更多的选择见表1。
        在这里插入图片描述

5.添加注释(文本、箭头、垂线)

通常为了增强数据的可视化效果,需要给一些特殊点做注释。这里对点(π,0)进行注释标记sin(π)=0,如图6所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=100)
y = np.sin(x)
plt.text(np.pi, 0, '$\sin({\pi})=0$', fontsize='20')
plt.plot(x, y)
plt.show()

在这里插入图片描述
为了更加明显地标明注释,这里加入一个箭头,如图7所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
plt.annotate('$\sin({\pi})=0$', xy=(np.pi, 0), xytext=(3 * np.pi / 2, 0.5),
             arrowprops=dict(facecolor='black', shrink=0.005))
plt.plot(x, y)
plt.show()

在这里插入图片描述
为了指明坐标中某一点的具体取值,通常是通过该点向坐标轴做垂线。下面以散点图的形式添加垂线,最终结果如图8所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
t = 3 * np.pi / 2
plt.plot([t, t], [0, np.sin(t)], color='red', linewidth=2.5, linestyle="--")
plt.scatter([t, ], [0], 50, color='red')
plt.plot(x, y)
plt.show()

在这里插入图片描述

6.调整坐标轴

通过mpl_toolkits.axisartist.axislines导入SubplotZero模块,以创建子图的形式将多个图像合并,最终得到的坐标轴如图9所示。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axisartist.axislines import SubplotZero

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
if 1:
    fig = plt.figure(1)
    ax = SubplotZero(fig, 1, 1, 1)
    fig.add_subplot(ax)
    for direction in ["xzero", "yzero"]:
        # 在每个轴的末尾添加箭头
        ax.axis[direction].set_axisline_style("-|>")
        # 从原点添加x和y轴
        ax.axis[direction].set_visible(True)
    for direction in ["left", "right", "bottom", "top"]:
        # 隐藏边界
        ax.axis[direction].set_visible(False)
    ax.plot(x, y)
plt.show()

在这里插入图片描述

插值

Numpy下的interp()函数是用来进行插值的操作的,这是一维线性插值法。插值是离散函数逼近的重要方法,即通过函数在有限个点处的取值情况,估算出函数在其他点处的近似值。与拟合不同的是,插值函数经过样本点,要求曲线通过所有的已知数据。拟合函数一般基于最小二乘法,尽量靠近并穿过所有样本点,结果如图10所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 20)
y = np.sin(x)
yp = None
xi = np.linspace(x[0], x[-1], 100)
yi = np.interp(xi, x, y, yp)
fig, ax = plt.subplots()
ax.plot(x, y, 'o', xi, yi, '.')
plt.show()

在这里插入图片描述

8.曲线的填充部分

在微积分运算中求曲线与坐标轴围成的面积,利用Matplotlib中fill_between刻画曲线与坐标轴之间围成的部分就非常重要了。这里选择sin(x)曲线与x轴围成的面积进行填充,如图11所示。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
fig, ax = plt.subplots(sharex=True)
ax.plot(x, y, color='black')
ax.axhline(0, color='black', lw=2)
ax.fill_between(x, 0, y)
plt.plot(x, y)
plt.show()

在这里插入图片描述

9.绘制完整的曲线

我们将上面的一些功能集中绘制出来,为了更好地展现结果,对其添加相应的注释,调整了坐标轴、刻度及箭头的样式,最终绘图如图12所示。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axisartist.axislines import SubplotZero

x = np.linspace(0, 2 * np.pi, num=256)
y = np.sin(x)
# 坐标轴
if 1:
    fig = plt.figure(1)
    ax = SubplotZero(fig, 1, 1, 1)
    fig.add_subplot(ax)
    for direction in ["xzero", "yzero"]:
        # 在每个轴的末尾添加箭头
        ax.axis[direction].set_axisline_style("-|>")
        # 从原点添加x和y轴
        ax.axis[direction].set_visible(True)
    for direction in ["left", "right", "bottom", "top"]:
        # 隐藏边界
        ax.axis[direction].set_visible(False)
    ax.plot(x, y)
    ax.set_title('sin(x)')
# 坐标
plt.xticks([0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi], ['$0$', '$\pi/2$', '$\pi$', r'$3\pi/2$', r'$2\pi$'])
plt.yticks([-1, 0, +1], ['$-1$', '$0$', '$+1$'])
# 垂线
t = 3 * np.pi / 2
plt.plot([t, t], [0, np.sin(t)], color='red', linewidth=2.5, linestyle="--")
plt.scatter([t, ], [0], 50, color='red')
# 注释
plt.annotate('$\sin({3\pi/2})=-1$', xy=(3*np.pi/2, -1), xytext=(2 * np.pi, -0.5),
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.show()

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐