在绘图上设置自动缩放限制以在所有点周围设置缓冲区

时间:2011-05-24 16:52:13

标签: limit matplotlib

我想在matplotlib中使用pyplot绘制一组点,但没有任何点位于我的轴的边缘。自动缩放(或其他)设置xlimylim,使得第一个和最后一个点通常位于x = xminxmax,这使得在某些情况下难以阅读。< / p>

对于loglog()semilog()绘图,这通常会出现问题,因为自动缩放会使xminxmax精确为10的幂,但如果我的数据仅包含三点,例如在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结束。然后,自动缩放ylim10**010**1,尽管数据仅位于图表的顶部。使用上面的解决方法,我可以增加ymax,以便第三点完全在限制范围内,但我不知道如何增加 ymin,以便减少空格在我的情节的下半部分。也就是说,关键在于我并不总是希望将我的极限分开,而是希望在我的所有点周围都有一些恒定(或比例)的缓冲区。

2 个答案:

答案 0 :(得分:8)

@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%的缓冲区。)

答案 1 :(得分:3)

今年早些时候,一个similar question被提交给了matplotlib-users列表。最有希望的解决方案涉及实现一个Locator(在这种情况下基于MaxNLocator)来覆盖MaxNLocator.view_limits。