【问题标题】:Set autoscale limits on plot to have buffer around all points在绘图上设置自动缩放限制以在所有点周围都有缓冲区
【发布时间】:2011-05-24 16:52:13
【问题描述】:

我想在 matplotlib 中使用 pyplot 绘制一组点,但没有一个点位于我的轴边缘。自动缩放(或其他东西)设置xlim 和ylim 使得第一个和最后一个点通常位于x = xmin 或xmax 使得在某些情况下难以阅读。

这对于loglog() 或semilog() 绘图更常见,因为自动缩放希望xmin 和xmax 精确到十的幂,但如果我的数据仅包含三个点,例如在xdata = [10**2,10**3,10**4],那么第一个和最后一个点将位于绘图的边界上。

尝试的解决方法

这是我在图表的任一侧添加 10% 缓冲区的解决方案。但是有没有办法更优雅或自动地做到这一点?

from numpy import array, log10
from matplotlib.pyplot import *

xdata = array([10**2,10**3,10**4])
ydata = xdata**2

figure()
loglog(xdata,ydata,'.')
xmin,xmax = xlim()
xbuff = 0.1*log10(xmax/xmin)
xlim(xmin*10**(-xbuff),xmax*10**(xbuff))

我希望有一个单行或两行的解决方案,每当我制作这样的情节时,我都可以轻松使用它。

线性图

为了明确我在解决方法中所做的事情,我应该在线性空间(而不是日志空间)中添加一个示例:

plot(xdata,ydata)
xmin,xmax = xlim()
xbuff = 0.1*(xmax-xmin)
xlim(xmin-xbuff,xmax+xbuff))

这与前面的示例相同,但用于线性轴。

限制太大

一个相关的问题是有时限制太大。假设我的数据类似于ydata = xdata**0.25,因此该范围内的方差远小于十年,但恰好以10**1 结束。然后,自动缩放 ylim 为 10**0 到 10**1,尽管数据仅位于绘图的顶部。使用上面的解决方法,我可以增加 ymax 以便第三点完全在限制范围内,但我不知道如何增加 ymin 以便下部的空格更少我的情节。即,关键是我并不总是想将我的限制分开,而是希望在我的所有点周围有一些恒定(或成比例)的缓冲区。

【问题讨论】:

    标签: limit matplotlib


    【解决方案1】:

    @askewchan 我刚刚成功地实现了如何通过编辑 matplotlibrc 配置文件并直接从终端运行 python 来更改 matplotlib 设置。 还不知道原因,但是当我从 spyder3(我的 IDE)运行 python 时,matplotlibrc 不起作用。 只需按照此处的步骤matplotlib.org/users/customizing.html。

    1) 解决方案一(所有图的默认设置)

    试着把这个放在matplotlibrc中,你会看到缓冲区增加了:

    axes.xmargin        : 0.1  # x margin.  See `axes.Axes.margins`
    axes.ymargin        : 0.1  # y margin See `axes.Axes.margins`
    

    值必须介于 0 和 1 之间。

    Obs.:由于存在错误,规模尚未正常工作。它将为 matplotlib 1.5 修复(我的是 1.4.3...)。更多信息:

    2) 解决方案二(分别针对代码内的每个情节)

    还有边距功能(用于直接放入代码中)。示例:

    import numpy as np
    from matplotlib import pyplot as plt 
    t = np.linspace(-6,6,1000)
    plt.plot(t,np.sin(t))
    plt.margins(x=0.1, y=0.1)
    plt.savefig('plot.png')
    

    Obs.:这里的比例正在工作(0.1 将在 x 范围和 y 范围之前和之后增加 10% 的缓冲区)。

    【讨论】:

    【解决方案2】:

    今年早些时候,similar question 被提交到 matplotlib 用户列表中。最有希望的解决方案是实现一个定位器(在这种情况下基于MaxNLocator)来覆盖 MaxNLocator.view_limits。

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 2012-11-16
      • 2011-07-11
      • 2022-10-15
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多