代码之家  ›  专栏  ›  技术社区  ›  Jan-Bert

在matplotlib中向单个绘图添加标题或标签的正确方法

  •  2
  • Jan-Bert  · 技术社区  · 7 年前

    我有一个关于给情节加标题和/或标签的问题。 大多数时候,我更喜欢使用这样的系统:

    import matplotlib.pyplot as plt 
    x = [1,2,3,4]
    y = [20, 21, 20.5, 20.8]
    
    fig, axarr = plt.subplots(n,m)
    axarr[n,m] = plt.plot(x,y)
    axarr[n,m].set_xlabel('x label')
    axarr[n,m].set_ylabel('y label')
    axarr[n,m].set_xlabel('title')
    etc
    

    但现在我转换了一个matlab脚本,为了尽可能接近这个系统,我想尝试一下。 我希望我的代码必须是这样的:

    import matplotlib.pyplot as plt 
    x = [1,2,3,4]
    y = [20, 21, 20.5, 20.8]
    
    ax = plt.plot(x,y)
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.set_xlabel('title')
    etc
    

    AttributeError: 'list' object has no attribute 'set_xlabel'

    https://sites.google.com/site/scigraphs/tutorial 下面的代码可以工作。

    #import matplotlib libary
    import matplotlib.pyplot as plt
    
    
    #define some data
    x = [1,2,3,4]
    y = [20, 21, 20.5, 20.8]
    
    #plot data
    plt.plot(x, y, linestyle="dashed", marker="o", color="green")
    
    #configure  X axes
    plt.xlim(0.5,4.5)
    plt.xticks([1,2,3,4])
    
    #configure  Y axes
    plt.ylim(19.8,21.2)
    plt.yticks([20, 21, 20.5, 20.8])
    
    #labels
    plt.xlabel("this is X")
    plt.ylabel("this is Y")
    
    #title
    plt.title("Simple plot")
    
    #show plot
    plt.show()
    

    基本上我的问题是,为什么我不能使用中间方法来添加标签或标题(请说明原因),但我需要或子图(方法1)还是示例中的方法?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Diziet Asahi    7 年前

    the documentation for plot() explains 返回的列表 Line2D Axes ,这就是您的第二个代码无法工作的原因。

    本质上,有两种方法可以使用matplotlib:

    • pyplot API ( import matplotlib.pyplot as plt ). 然后每个命令以 plt.xxxxx() 它们处理最后创建的Axes对象,通常不需要显式引用。

    plt.plot(x,y)
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.xlabel('title')
    
    • 要么你使用面向对象的方法

    fig, ax = plt.subplots()
    line, = ax.plot(x,y)
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.set_xlabel('title')
    

    通常不建议将这两种方法混合使用。pyplot API对于从MATLAB迁移的人很有用,但由于有几个子图,很难确定要处理哪些轴,因此建议使用面向对象的方法。

    看见 this part of matplotlib FAQs