【问题标题】:set axis limits in loglog plot with matplotlib使用 matplotlib 在 loglog 图中设置轴限制
【发布时间】:2012-07-06 23:12:08
【问题描述】:

如何在我用 matplotlib 绘制的点周围创建空间?

例如,在这个图中,左下角的点被轴截断,但我希望点和轴之间有更多的空间。

import matplotlib.pyplot as plt
x = [2**i for i in xrange(4,14)]
y = [i**2 for i in x]
plt.loglog(x,y,'ro',basex=2,basey=2)
plt.xlim([0, 2**14]) # <--- this line does nothing
plt.show()

在交互模式下,xlim 行返回 (16.0, 16384),旧值而不是我尝试设置的新值。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    不能在 loglog 图上绘制零 (log(0) = -inf)。它静默失败,因为它不能使用 0 作为限制。

    改用plt.xlim([1,2**14])

    【讨论】:

    • 静默失败并没有帮助,但当然不能绘制 0!很好的答案。
    【解决方案2】:

    如果您正在寻找处理此问题的通用方法并希望自动调整绘图的限制(即使不知道任何数据),您也可以编写一个受this answer 启发的 sn-p 到类似的问题。

    请注意,您必须稍微调整代码并对其进行更改,以便它也可以完成 y 轴的工作。

    【讨论】:

      【解决方案3】:

      这里我使用plt.axis() 设置xmin 和xmax 值(类似于您的plt.xlim 调用);但我使用基于范围和间隔的变量“缓冲区”。轴的范围是通过使用最小值和最大值得出的。由于对数刻度不绘制 0 或负数,因此我在 .axis() 函数调用中将 xmin 参数设置为等于 1。

      interval = 10
      
      plot_range_buffer = (data.column.max() - data.column.min() / interval
      
      plt.axis(
          xmin=1, # to keep scale if minimum is 0 or close to 0
          #xmin = data.column.min()-plot_range_buffer # subtracts interval buffer from min value
          xmax=data.column.max()+plot_range_buffer # adds the interval buffer to max value
      )
      

      我们可以根据需要对 y 轴做同样的事情。控制情节的一个方面需要很多代码,但如果 matplotlib.pyplot 很糟糕,我喜欢在用户函数中使用它。
      这是用于反复试验的两个模板用户例程。我测试了第一个,它运行良好;我刚刚构建了第二个作为替代选项,但没有对其进行测试...如果出现错误,请告诉我。

      用户函数 #1: 函数内的完全控制

      def plotcolumn(some_row_entry):
          """Selects data for some row entry
             Creates a scatter plot from two column variables
             Allows for user control over buffers through manipulation
                 of interval that is relative to axis max,min range"""
      
          # numpy fancy selector for input argument
          data = data[data.some_row_entry == some_row_entry]
      
          # establish plot
          data.plot.scatter(
              'first_column',
              'second_column',
              logx=True,                                   # turn log xaxis on/off
              #logy=True                                    # turn log yaxis on/off
          )
      
          # axis range controls
          x_interval = 10
          y_interval = 10
      
          # x axis (ie x-axis variable)
          x_buffer = (data.first_column.max() - data.first_column.min()) / x_interval
      
          # y axis (ie y-axis variable)
          y_buffer = (data.second_column.max() - data.second_column.min()) / y_interval
      
          plt.axis(
              xmin=1,                                      # use for xaxis lower buffer if logx and close to 0
              xmax=data.first_column.max()+x_buffer,       # sets xaxis upper buffer
              #xmin=data.first_column.min()-x_buffer,      # sets xaxis lower buffer if not logx close to 0
      
              #ymin= 1,                                     # use for yaxis lower buffer if logy and close to 0
              ymax= data.second_column.max()+y_buffer,     # sets yaxis upper buffer
              ymin= data.second_column.min()-y_buffer     # sets yaxis lower if not logy close to 0
          )
      

      用户函数#2:为一个轴和间隔传递参数

      def plotcolumn_log_cond(some_row_entry, logaxis = 'x', interval = 10):
      
          """Selects data for some row entry
             Creates a scatter plot from two column variables.
             Arguments:
                 Set axis to be logged (x or y as string)
                 Pass interval value (as number)
             """
      
      
          # numpy fancy selector for input argument
          data = data[data.some_row_entry == some_row_entry]
      
          # establish plot
          data.plot.scatter(
              'first_column',
              'second_column',
              logx=True)
      
      
          # LOG XAXIS
          if logaxis = 'x':
      
              # establish plot
              data.plot.scatter(
                  'first_column',
                  'second_column',
                  logx=True
              )
      
              # axis range controls
              x_interval = interval
      
              # x axis (ie x-axis variable)
              x_buffer = (data.first_column.max() - data.first_column.min()) / x_interval
      
              plt.axis(
                  xmin=1,                                      # use for xaxis lower buffer if logx and close to 0
                  xmax=data.first_column.max()+x_buffer,       # sets xaxis upper buffer
                  #xmin=data.first_column.min()-x_buffer,      # sets xaxis lower buffer if not logx close to 0
              )
      
      
          # LOG YAXIS
          if logaxis = 'y':
      
              # establish plot
              data.plot.scatter(
                  'first_column',
                  'second_column',
                  logy=True
              )
      
              # axis range controls
              y_interval = interval
      
              # x axis (ie x-axis variable)
              y_buffer = (data.second_column.max() - data.second_column.min()) / y_interval
      
              plt.axis(
                  ymin=1,                                       # use for yaxis lower buffer if logy and close to 0
                  ymax=data.second_column.max()+y_buffer,       # sets yaxis upper buffer
                  #ymin=data.second_column.min()-y_buffer,      # sets yaxis lower buffer if not logy close to 0
              )
      
      
          # NOT X OR Y PASSED
          if (logaxis != 'x') & (logaxis != 'y'):
      
              # establish plot
              data.plot.scatter(
                  'first_column',
                  'second_column')
      

      【讨论】:

        猜你喜欢
        • 2015-01-05
        • 2014-06-09
        • 2011-04-16
        • 2015-07-31
        相关资源
        最近更新 更多