代码之家  ›  专栏  ›  技术社区  ›  Eric Auld

Matplotlib:将线收集到同一轴上

  •  0
  • Eric Auld  · 技术社区  · 7 年前

    我刚开始用“正确”的方法使用matplotlib。我正在写各种各样的程序,每个程序都会给我一个时间序列,我想把不同时间序列的图表叠加起来,如下所示:

    我想我要的是在主函数中定义的单个 实例,然后我调用我的每个小函数,它们都返回a line2d instance,然后我将它们全部放到 轴上 object i created.

    但是,我在使用现有的 line2d object并将其添加到现有的 axs object(就像我想用我的函数的输出来做一样)时遇到了困难。我想使用一个 line2d called a an d say ax.add(a)

    导入matplotlib.pyplot as plt a,=plt.plot([1,2,3],[3,4,5],label='a') 图,ax=plt.子批次()。 ax.添加线(a) < /代码>

    给我一个runtimeerror:“不能将单个艺术家放在多个数字中。”

    我猜随着时间的推移,Matplotlib已经不再希望用户能够向任何 轴添加给定的行。在 this的评论中讨论了类似的事情,但他们谈论的是an axes object in two different figure. objects.

    实现我想要的最好方法是什么?我宁愿保持主脚本整洁,不要说 ax.plot(some_data) over and over when I want to overlapsive these lines.

    enter image description here

    我想我想要一个单人间 Axes 实例在主函数中定义,然后调用每个小函数,它们都返回 Line2D 例如,然后我会把它们全部放在 轴线 我创建的对象。

    但我很难接受现有的 线2D 对象并将其添加到现有的 轴线 对象(就像我想处理函数的输出一样),我想 线2D 打电话 a 然后说 ax.add_line(a) .

    import matplotlib.pyplot as plt
    
    a, = plt.plot([1,2,3], [3,4,5], label = 'a')
    fig, ax = plt.subplots()
    ax.add_line(a)
    

    给我一个runtimeerror:“不能将单个艺术家放在多个数字中。”

    我猜随着时间的推移,matplotlib已经不再希望用户能够向任何 轴线 他们想要。在以下评论中讨论了类似的事情: this 回答,除了他们说的 轴线 两个不同的对象 Figure 物体。

    实现我想要的最好方法是什么?我宁愿保持我的主脚本整洁,而不是说 ax.plot(some_data) 当我想要叠加这些线条时,我会一遍又一遍。

    2 回复  |  直到 7 年前
        1
  •  1
  •   ImportanceOfBeingErnest    7 年前

    import numpy as np
    import matplotlib.pyplot as plt
    
    def get_line(label="a"):
        return plt.Line2D(np.linspace(0,1,10), np.random.rand(10), label = label)
    
    fig, ax = plt.subplots()
    ax.add_line(get_line(label="a"))
    ax.add_line(get_line(label="b"))
    ax.add_line(get_line(label="z"))
    ax.legend()
    
    plt.show()
    

    would recommend

    import numpy as np
    import matplotlib.pyplot as plt
    
    def plot_line(ax=None, label="a"):
        ax = ax or plt.gca()
        line, = ax.plot(np.linspace(0,1,10), np.random.rand(10), label = label)
        return line
    
    fig, ax = plt.subplots()
    plot_line(ax, label="a")
    plot_line(ax, label="b")
    plot_line(ax, label="z")
    ax.legend()
    
    plt.show()
    
        2
  •  0
  •   Sheldore    7 年前

    import matplotlib.pyplot as plt
    
    x = np.array([1,2,3])
    y = np.array([3,4,5])
    label = '1'
    
    def plot(x,y,label):
        a, = plt.plot(x,y, label = label)
        return a
    
    fig, ax = plt.subplots()
    plot(x,y,label)
    plot(x,1.5*y,label)
    

    plot labels ax