【问题标题】:matplotlib get ylim valuesmatplotlib 获取 ylim 值
【发布时间】:2014-09-30 23:05:30
【问题描述】:

我正在使用 matplotlib 从 Python 中绘制数据(使用 ploterrorbar 函数)。我必须绘制一组完全独立且独立的图,然后调整它们的 ylim 值,以便可以轻松地进行视觉比较。

如何从每个图中检索 ylim 值,以便分别获取上下 ylim 值的最小值和最大值,并调整图以便在视觉上比较它们?

当然,我可以只分析数据并提出我自己的自定义 ylim 值...但我想使用 matplotlib 为我做这件事。关于如何轻松(有效)做到这一点的任何建议?

这是我使用 matplotlib 绘制的 Python 函数:

import matplotlib.pyplot as plt

def myplotfunction(title, values, errors, plot_file_name):

    # plot errorbars
    indices = range(0, len(values))
    fig = plt.figure()
    plt.errorbar(tuple(indices), tuple(values), tuple(errors), marker='.')

    # axes
    axes = plt.gca()
    axes.set_xlim([-0.5, len(values) - 0.5])
    axes.set_xlabel('My x-axis title')
    axes.set_ylabel('My y-axis title')

    # title
    plt.title(title)

    # save as file
    plt.savefig(plot_file_name)

    # close figure
    plt.close(fig)

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    只需使用axes.get_ylim(),它与set_ylim 非常相似。来自docs

    get_ylim()

    获取y轴范围[底部,顶部]

    【讨论】:

    • 有没有办法获得图形区域限制,而不是轴限制?黑色边框略超出这些值。
    • @PeterEhrlich 这只是边距。
    • 我发现 plt.gca().get_ylim() 很方便 - 不需要额外的轴定义。
    • 另外,我更喜欢使用fig, ax = plt.subplots(),然后通过figax 路由我的所有功能
    【解决方案2】:
     ymin, ymax = axes.get_ylim()
    

    如果您直接使用plt api,则可以完全避免调用axes

    def myplotfunction(title, values, errors, plot_file_name):
    
        # plot errorbars
        indices = range(0, len(values))
        fig = plt.figure()
        plt.errorbar(tuple(indices), tuple(values), tuple(errors), marker='.')
    
        plt.ylim([-0.5, len(values) - 0.5])
        plt.xlabel('My x-axis title')
        plt.ylabel('My y-axis title')
    
        # title
        plt.title(title)
    
        # save as file
        plt.savefig(plot_file_name)
    
       # close figure
        plt.close(fig)
    

    【讨论】:

    • 直接使用 plt api 与使用轴相比有优势吗?我看到很多人建议使用轴更好,但我无法确定原因。
    • Axes 更具程序性 - 例如,您可以构建一个函数库,用于获取和操作轴对象。但是plt 对象更多是为了快速做一些事情。因此,如果您正在修补,plt 会更快。如果你正在构建一个更大的应用程序,axes 可能是最好的。无论如何,这一直是我的经验。老实说,这总体上是一个奇怪的 API。
    • 整个怪异的 API 都源于 MATLAB。来源:matplotlib.org/stable/users/history.html
    【解决方案3】:

    利用上面的好答案并假设您只使用 plt

    import matplotlib.pyplot as plt
    

    然后您可以使用plt.axis() 获得所有四个绘图限制,如下例所示。

    import matplotlib.pyplot as plt
    
    x = [1, 2, 3, 4, 5, 6, 7, 8]  # fake data
    y = [1, 2, 3, 4, 3, 2, 5, 6]
    
    plt.plot(x, y, 'k')
    
    xmin, xmax, ymin, ymax = plt.axis()
    
    s = 'xmin = ' + str(round(xmin, 2)) + ', ' + \
        'xmax = ' + str(xmax) + '\n' + \
        'ymin = ' + str(ymin) + ', ' + \
        'ymax = ' + str(ymax) + ' '
    
    plt.annotate(s, (1, 5))
    
    plt.show()
    

    上面的代码应该产生以下输出图。

    【讨论】:

      【解决方案4】:

      我将上述方法放在一起使用ax而不是plt

      import numpy as np
      import matplotlib.pyplot as plt
      
      x = range(100)
      y = x
      
      fig, ax = plt.subplots(1, 1, figsize=(7.2, 7.2))
      ax.plot(x, y);
      
      # method 1
      print(ax.get_xlim())
      print(ax.get_xlim())
      # method 2
      print(ax.axis())
      

      【讨论】:

        【解决方案5】:

        这是一个老问题,但我没有看到提到,根据细节,sharey 选项可能能够为您完成所有这些工作,而不是挖掘轴限制、边距等。有文档中的 demo 显示如何使用 sharex,但同样可以使用 y-axes。

        【讨论】:

          【解决方案6】:

          只需使用plt.ylim(),它可以用于设置或获取最小和最大限制

          ymin, ymax = plt.ylim()
          

          【讨论】:

          • 警告:如果您使用轴,此解决方案将始终返回 ymin=0, ymax=1。在这种情况下更喜欢 ymin, ymax = axes.get_ylim()
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-25
          • 2021-02-11
          • 1970-01-01
          • 2012-06-14
          • 1970-01-01
          相关资源
          最近更新 更多