【问题标题】:How do I tell Matplotlib to create a second (new) plot, then later plot on the old one?如何告诉 Matplotlib 创建第二个(新)图,然后在旧图上绘制?
【发布时间】:2011-10-18 12:29:56
【问题描述】:

我想绘制数据,然后创建一个新的图形并绘制数据2,最后回到原来的绘图并绘制数据3,有点像这样:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

仅供参考How do I tell matplotlib that I am done with a plot? 做了类似的事情,但不完全是!它不允许我访问那个原始情节。

【问题讨论】:

    标签: python matplotlib plot figure


    【解决方案1】:

    如果您发现自己经常做这样的事情,那么可能值得研究 matplotlib 的面向对象接口。在你的情况下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(5)
    y = np.exp(x)
    fig1, ax1 = plt.subplots()
    ax1.plot(x, y)
    ax1.set_title("Axis 1 title")
    ax1.set_xlabel("X-label for axis 1")
    
    z = np.sin(x)
    fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
    ax2.plot(x, z)
    ax3.plot(x, -z)
    
    w = np.cos(x)
    ax1.plot(x, w) # can continue plotting on the first axis
    

    它有点冗长,但更清晰,更容易跟踪,尤其是有几个数字,每个数字都有多个子图。

    【讨论】:

    • 我更喜欢面向对象的方法,因为当我预计会有很多数字时,使用名称而不是数字来跟踪它们会更容易。谢谢!
    • 但是如何使用这种方法更改标签和轴限制。如果我使用ax1.ylabel,则表示找不到。与fig1.ylabel 相同 ...
    • @GeorgeDatseris 语法有点不同。是ax1.set_xlabel("your x label")ax1.set_ylabel("your y label")ax1.set_title("your title")
    • 你为什么用 111 ?
    • @yashSodha - 这是一个 matlab 样式的子图数量规范(行、列、索引)。但是现在使用plt.subplots(nrows, ncols) 要容易得多。已更新示例。
    【解决方案2】:

    当您致电figure 时,只需为情节编号。

    x = arange(5)
    y = np.exp(5)
    plt.figure(0)
    plt.plot(x, y)
    
    z = np.sin(x)
    plt.figure(1)
    plt.plot(x, z)
    
    w = np.cos(x)
    plt.figure(0) # Here's the part I need
    plt.plot(x, w)
    

    编辑:请注意,您可以根据需要对图进行编号(此处从 0 开始),但如果您在创建新图时根本没有为图提供编号,则自动编号将从1(根据文档为“Matlab 样式”)。

    【讨论】:

    • 这似乎在 matplotlib 的交互模式下工作,而 figure() ... add_subplot() 方法不能。谢谢!
    • @SebMa 请不要在不了解代码的情况下更改代码。这个答案专门关于将一个数字传递给您删除的figure。您更改的其他内容是从原始帖子中复制的,而不是我的回答中的错误。
    • @agf 嗨,我删除了plt.figure(1) 中的1,因为我认为这个数字是自动递增的,因此没有必要。对不起。
    【解决方案3】:

    但是,编号从 1 开始,所以:

    x = arange(5)
    y = np.exp(5)
    plt.figure(1)
    plt.plot(x, y)
    
    z = np.sin(x)
    plt.figure(2)
    plt.plot(x, z)
    
    w = np.cos(x)
    plt.figure(1) # Here's the part I need, but numbering starts at 1!
    plt.plot(x, w)
    

    另外,如果图上有多个轴,例如子图,请使用axes(h) 命令,其中h 是所需轴对象的句柄,以关注该轴。

    (还没有评论权限,抱歉新答案!)

    【讨论】:

    • 0 有效,自动编号从 1 开始,如果您根本不给它编号。
    【解决方案4】:

    为每次迭代绘制单独帧的简单方法是:

    import matplotlib.pyplot as plt  
    for grp in list_groups:
            plt.figure()
            plt.plot(grp)
            plt.show()
    

    然后python会绘制不同的帧。

    【讨论】:

      【解决方案5】:

      经过一番挣扎后我发现的一种方法是创建一个函数,该函数获取 data_plot 矩阵、文件名和顺序作为参数,以从有序图中的给定数据创建箱线图(不同的顺序 = 不同的图)并将其保存在给定的文件名下.

      def plotFigure(data_plot,file_name,order):
          fig = plt.figure(order, figsize=(9, 6))
          ax = fig.add_subplot(111)
          bp = ax.boxplot(data_plot)
          fig.savefig(file_name, bbox_inches='tight')
          plt.close()
      

      【讨论】:

        【解决方案6】:

        这里接受的答案是使用面向对象的接口(即matplotlib),这是要走的路。答案的代码确实包含(一些)MATLAB 风格的界面(即matplotib.pyplot)。

        也可以选择仅使用 OOP 方法,它可以直接解决手头的问题并允许我们一次处理多个图形:

        import numpy as np
        import matplotlib
        
        x = np.arange(5)
        y = np.exp(x)
        first_figure      = matplotlib.figure.Figure()
        first_figure_axis = first_figure.add_subplot()
        first_figure_axis.plot(x, y)
        
        z = np.sin(x)
        second_figure      = matplotlib.figure.Figure()
        second_figure_axis = second_figure.add_subplot()
        second_figure_axis.plot(x, z)
        
        w = np.cos(x)
        first_figure_axis.plot(x, w)
        
        display(first_figure) # Jupyter
        display(second_figure)
        

        这使用户可以手动控制图形,并避免与 pyplot 的内部状态仅支持单个图形相关的问题,例如当您想从库函数返回图形时。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2019-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多