Python 在matplotlib中使用plot、Axis或figure绘制绘图有什么区别?

Python 在matplotlib中使用plot、Axis或figure绘制绘图有什么区别?,python,matplotlib,Python,Matplotlib,当我在matplotlib,tbh中绘制绘图时,我有点搞不清楚后端发生了什么,我不清楚绘图、轴和图形的层次结构。我阅读了文档,它很有帮助,但我仍然感到困惑 以下代码以三种不同的方式绘制相同的绘图- #creating the arrays for testing x = np.arange(1, 100) y = np.sqrt(x) #1st way plt.plot(x, y) #2nd way ax = plt.subplot() ax.plot(x, y) #3rd way figure

当我在matplotlib,tbh中绘制绘图时,我有点搞不清楚后端发生了什么,我不清楚绘图、轴和图形的层次结构。我阅读了文档,它很有帮助,但我仍然感到困惑

以下代码以三种不同的方式绘制相同的绘图-

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)
现在我的问题是-

  • 这三种方法之间的区别是什么?我的意思是,当调用这三种方法中的任何一种时,引擎盖下会发生什么

  • 什么时候应该使用哪种方法?在这些问题上使用任何方法的优缺点是什么


  • 方法1

    plt.plot(x, y)
    
    这使您可以使用(x,y)坐标仅绘制一个图形。如果你只想得到一个图形,你可以用这种方式

    方法2

    ax = plt.subplot()
    ax.plot(x, y)
    
    这样可以在同一窗口中绘制一个或多个地物。在编写时,您将只绘制一个图形,但您可以制作如下内容:

    fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
    
    您将在同一窗口中绘制4个图形,分别命名为ax1、ax2、ax3和ax4。用我的例子,这个窗口将被分成4个部分

    方法3

    fig = plt.figure()
    new_plot = fig.add_subplot(111)
    new_plot.plot(x, y)
    
    我没有使用它,但是你可以找到文档

    示例:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # Method 1 #
    
    x = np.random.rand(10)
    y = np.random.rand(10)
    
    figure1 = plt.plot(x,y)
    
    # Method 2 #
    
    x1 = np.random.rand(10)
    x2 = np.random.rand(10)
    x3 = np.random.rand(10)
    x4 = np.random.rand(10)
    y1 = np.random.rand(10)
    y2 = np.random.rand(10)
    y3 = np.random.rand(10)
    y4 = np.random.rand(10)
    
    figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
    ax1.plot(x1,y1)
    ax2.plot(x2,y2)
    ax3.plot(x3,y3)
    ax4.plot(x4,y4)
    
    plt.show()
    

    其他示例:

    对象的名称 Matplotlib是一个非常面向对象的库,它的主要对象是图形和轴(我发现
    轴的名称有点误导,但可能只是我自己)

    您可以将图形视为画布,您通常会指定其尺寸,并可能指定背景色等。您使用画布,即图形,基本上有两种方式,将其他对象放置在画布上(主要是,但也包括文本标签等)并使用
    savefig
    保存其内容

    你可以把轴看作是一种瑞士军刀,一种方便的工具(例如,
    .plot
    .scatter
    .hist
    等),主要用于一切。你可以放置一个,两个。。。使用多种不同方法中的一种,在图形中有许多

    plt
    接口 plt程序接口最初是为了模拟MATLAB而开发的™ 接口,但与面向对象的接口没有真正的区别,即使您没有直接引用主要对象(即图形和轴),这些对象也会自动实例化,每个plt方法本质上都是,转换为对底层基本对象的方法之一的调用:例如,
    plt.plot()
    隐藏的轴。plot
    plt.savefig
    隐藏的图。savefig

    在任何时候,您都可以使用
    plt.gcf
    plt.gca
    对这些隐藏对象进行控制,当其中一个对象方法尚未移植到plt命名空间中的方法时,这是必要的

    我想补充一点,plt名称空间还包含许多方便的方法,可以以不同的方式实例化图形和

    你的例子 第一路

    plt.plot(x, y)
    
    在这里,您仅使用plt界面,在每个图形中只能使用一个,但这正是您在探索数据时所需要的, 一个快速完成工作的食谱

    第二条路

    ax = plt.subplot()
    ax.plot(x, y)
    
    在这里,您使用plt名称空间中的一种方便方法为轴对象指定名称(和句柄),但顺便说一句,还有一个隐藏的图形。稍后,您可以使用对象进行绘图、制作直方图等,您可以使用plt界面执行所有操作,但您也可以访问其所有属性并更自由地修改它们

    第三条路

    figure = plt.figure()
    new_plot = figure.add_subplot(111)
    new_plot.plot(x, y)
    
    在这里,您开始使用plt命名空间中的一个方便方法来实例化图,之后只使用面向对象的接口

    可以绕过plt便利方法(
    matplotlib.figure.figure
    ),但随后必须调整图形以获得更好的交互体验(毕竟,这是一种便利方法)

    个人推荐 我建议在交互式会话的上下文中使用bare
    plt.plot
    plt.scatter
    ,可能使用它的magic命令,也可以在探索性Jupyter笔记本的上下文中使用

    另一方面,面向对象的方法,加上一些
    plt
    方便的方法,就是要走的路

    • 如果你有一个永久性的问题需要用 精心调整的子地块的定制布局
    • 如果要在所编写程序的UI中嵌入Matplotlib

    在这两个极端之间有一个很大的灰色区域,如果你问我该怎么做,我会说“这要看情况了”…

    我已经读过了,但我觉得答案一点也不令人满意。它解释了层次结构,但也引起了困惑,为什么没有一种传统的方式,为什么图形对象甚至被暴露?我不确定您是否引用了这个确切的文档。这就回答了你的问题,为什么这个数字会暴露出来。就我个人而言,这是我找到的对matplotlib最好的解释。Figure对象允许您在不使用轴的情况下直接添加自己的美工师,尽管这很少使用,除非您想调整图形本身的“补丁”等。请注意,图形是父容器,承载轴和美工师。@hashcode55每个图形都是独立的。我给你看一本书example@hashcode55我将用一个例子来编辑(仅仅是我在天体物理学研究中的数字,