使用Matplotlib绘图-Python成为专业人士笔记

    技术2025-05-04  15

    来自<Python成为专业人士笔记系列>

    python成为专业人士笔记

    Matplotlib介绍

    matplotlib是Python编程语言及其数值数学扩展包 NumPy的可视化操作界面。它利用通用的图形用户界面工具包,如Tkinter, wxPython, Qt或GTK+,向应用程序嵌入式绘图提供了应用程序接口(API)。此外,matplotlib还有一个基于图像处理库(如开放图形库OpenGL)的pylab接口,其设计与MATLAB非常类似–尽管并不怎么好用。SciPy就是用matplotlib进行图形绘制。

    matplotlib最初由John D. Hunter撰写,它拥有一个活跃的开发社区,并且根据BSD样式许可证分发。 在John D. Hunter2012年去世前不久,Michael Droettboom被提名为matplotlib的主要开发者。

    截至到2015年10月30日,matplotlib 1.5.x支持Python 2.7到3.5版本。Matplotlib 1.2是第一个支持Python 3.x的版本。Matplotlib 1.4是支持Python 2.6的最后一个版本。

    与MATLAB的比较

    pyplot是matplotlib的一个模块,它提供了一个类似MATLAB的接口。 matplotlib被设计得用起来像MATLAB,具有使用Python的能力。免费是其优点。

    与 Gnuplot的比较

    gnuplot和matplotlib都是成熟的开源项目。 它们都可以产生多种不同绘图类型。 虽然很难指定一种某人能做而他人不能做的图形类型,但它们仍然具有不同的优点和缺点:

    优点缺点Matplotlib带有内置代码的默认绘图样式与Python的深度集成Matlab风格的编程接口(对一些人来说是优点,但对于其他人来说可能是缺点)。图形绘制相较Gnuplot更加美观高度依赖其他包,如Numpy。只适用于Python:很难/不可能在Python以外的语言中使用。 (但可以从Julia通过PyPlot软件包使用)Gnuplot跨语言解决方案:可以用作通过管道或文件以不同语言编写的应用程序(例如GNU Octave,Maxima,JavaGnuplotHybrid)中的绘图引擎。独立程序:没有外部依赖。处理大型数据集时非常快。更容易操纵绘图细节旧的默认绘图样式:通常需要小的调整以产生有吸引力的图。在开发中活跃成员的数量较少(与Matplotlib相比)。

    例子[可使用创帆云免费JupyterNote环境测试]

    曲线图

    >>> import matplotlib.pyplot as plt >>> import numpy as np >>> a = np.linspace(0,10,100) >>> b = np.exp(-a) >>> plt.plot(a,b) >>> plt.show()

    直方图

    >>> import matplotlib.pyplot as plt >>> from numpy.random import normal,rand >>> x = normal(size=200) >>> plt.hist(x,bins=30) >>> plt.show()

    散点图

    >>> import matplotlib.pyplot as plt >>> from numpy.random import rand >>> a = rand(100) >>> b = rand(100) >>> plt.scatter(a,b) >>> plt.show()

    3D 图

    >>> from matplotlib import cm >>> from mpl_toolkits.mplot3d import Axes3D >>> import matplotlib.pyplot as plt >>> import numpy as np >>> fig = plt.figure() >>> ax = fig.gca(projection='3d') >>> X = np.arange(-5, 5, 0.25) >>> Y = np.arange(-5, 5, 0.25) >>> X, Y = np.meshgrid(X, Y) >>> R = np.sqrt(X**2 + Y**2) >>> Z = np.sin(R) >>> surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm) >>> plt.show()

    Matplotlib中的一个简单图形

    这个示例演示了如何使用Matplotlib创建简单的正弦曲线 :

    import numpy as np import matplotlib.pyplot as plt # 介于0 和 2*pi 之间的角 x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) # 正弦函数 plt.plot(x, y) plt.show()

    使用免费创帆云在线JupyterNote运行后效果如下:

    向简单图添加更多特性:轴标签、标题、轴刻度、网格和图例

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) # 在x轴和y轴上设置刻度值 xnumbers = np.linspace(0, 7, 15) ynumbers = np.linspace(-1, 1, 11) plt.plot(x, y, color='r', label='sin') # r - 红色 plt.xlabel("Angle in Radians") plt.ylabel("Magnitude") plt.title("Plot of some trigonometric functions") plt.xticks(xnumbers) plt.yticks(ynumbers) plt.legend() plt.grid() plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend] plt.show() import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) z = np.cos(x) # X轴和Y轴设置刻度 xnumbers = np.linspace(0, 7, 15) ynumbers = np.linspace(-1, 1, 11) plt.plot(x, y, color='r', label='sin') # r - 红 plt.plot(x, z, color='g', label='cos') # g - 绿 plt.xlabel("Angle in Radians") plt.ylabel("Magnitude") plt.title("Plot of some trigonometric functions") plt.xticks(xnumbers) plt.yticks(ynumbers) plt.legend() plt.grid() plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend] plt.show()

    使用免费创帆云在线JupyterNote运行后效果如下:

    通过类似于MATLAB的图叠加,在同一图形中绘制多个图形

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) z = np.cos(x) # X轴和Y轴设置刻度 xnumbers = np.linspace(0, 7, 15) ynumbers = np.linspace(-1, 1, 11) plt.plot(x, y, 'r', x, z, 'g') # r, g - 红和绿 plt.xlabel("Angle in Radians") plt.ylabel("Magnitude") plt.title("Plot of some trigonometric functions") plt.xticks(xnumbers) plt.yticks(ynumbers) plt.legend(['sine', 'cosine']) plt.grid() plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend] plt.show()

    使用免费创帆云在线JupyterNote运行后效果如下:

    多重绘图

    与前面的示例类似,这里使用单独的plot命令将正弦曲线和余弦曲线绘制在同一图形上。这更符合python的风格,可以用于为每个plot获得单独的句柄

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) z = np.cos(x) # X轴和Y轴设置刻度 xnumbers = np.linspace(0, 7, 15) ynumbers = np.linspace(-1, 1, 11) plt.plot(x, y, color='r', label='sin') # r - 红 plt.plot(x, z, color='g', label='cos') # g - 绿 plt.xlabel("Angle in Radians") plt.ylabel("Magnitude") plt.title("Plot of some trigonometric functions") plt.xticks(xnumbers) plt.yticks(ynumbers) plt.legend() plt.grid() plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend] plt.show()

    使用免费创帆云在线JupyterNote运行后效果如下:

    使用twiny()绘制相同x轴但不同y轴的图形

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2.0*np.pi, 101) y = np.sin(x) z = np.sinh(x) # 分离图形对象和轴对象 fig, ax1 = plt.subplots() # 复制不同的y坐标轴及相同的x轴 ax2 = ax1.twinx() # ax2 和ax1 将有共同的x轴和不同的y轴 # 在坐标轴1和2上绘制曲线,并获得曲线句柄 curve1,= ax1.plot(x, y, label="sin", color='r') curve2,= ax2.plot(x, z, label="sinh", color='b') # 创建一个list列表来访问曲线中的参数 curves = [curve1, curve2] # 通过坐标轴1或坐标轴2对象添加图例 ax1.legend(curves, [curve.get_label() for curve in curves]) #ax2.legend(curves, [curve.get_label() for curve in curves]) # ax1和ax2任意添加一个即可 # 图像全局属性 plt.title("Plot of sine and hyperbolic sine") plt.show()

    使用创帆云免费JupyterNote云环境运行如下:

    使用twiny()绘制共y轴和不同x轴的图形

    import numpy as np import matplotlib.pyplot as plt y = np.linspace(0, 2.0*np.pi, 101) x1 = np.sin(y) x2 = np.sinh(y) # 在x和y轴上制造刻度值 ynumbers = np.linspace(0, 7, 15) xnumbers1 = np.linspace(-1, 1, 11) xnumbers2 = np.linspace(0, 300, 7) # 分离图形对象和轴对象 fig, ax1 = plt.subplots() # 用不同的x轴和相同的y轴复制坐标轴 ax2 = ax1.twiny() # ax2 和ax1 将有公共的Y轴和不同的X轴 # 在坐标轴1和2上绘制曲线,并获得曲线句柄 curve1,= ax1.plot(x1, y, label="sin", color='r') curve2,= ax2.plot(x2, y, label="sinh", color='b') # 创建一个list 访问参数 curves = [curve1, curve2] # 给轴1或轴2添加图例(只需给其中一个增加即可) # ax1.legend(curves, [curve.get_label() for curve in curves]) ax2.legend(curves, [curve.get_label() for curve in curves]) # x axis labels via the axes ax1.set_xlabel("Magnitude", color=curve1.get_color()) ax2.set_xlabel("Magnitude", color=curve2.get_color()) # y axis label via the axes ax1.set_ylabel("Angle/Value", color=curve1.get_color()) # ax2.set_ylabel("Magnitude", color=curve2.get_color()) # 注意,这个写法是错误的,ax2 没有属性控制y轴 # y刻度——也给它们上颜色 ax1.tick_params(axis='y', colors=curve1.get_color()) # ax2.tick_params(axis='y', colors=curve2.get_color()) # 注意,此写法是错误的ax2 没有属性控制y轴 #x轴通过坐标轴旋转 ax1.tick_params(axis='x', colors=curve1.get_color()) ax2.tick_params(axis='x', colors=curve2.get_color()) # 设置x轴刻度 ax1.set_xticks(xnumbers1) ax2.set_xticks(xnumbers2) # 设置y轴刻度 ax1.set_yticks(ynumbers) # ax2.set_yticks(ynumbers) # 这样写也是可以的 # 用坐标轴制作网格 ax1.grid(color=curve2.get_color()) ax2.grid(color=curve2.get_color()) ax1.xaxis.grid(False) # 图表全局属性设置 plt.title("Plot of sine and hyperbolic sine") plt.show()

    使用创帆云免费JupyterNote云环境运行如下:

    Processed: 0.016, SQL: 9