我想在matplotlib中使用pyplot绘制一组点,但没有任何点位于我的轴的边缘。自动缩放(或其他)设置xlim
和ylim
,使得第一个和最后一个点通常位于x = xmin
或xmax
,这使得在某些情况下难以阅读。< / p>
对于loglog()
或semilog()
绘图,这通常会出现问题,因为自动缩放会使xmin
和xmax
精确为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
结束。然后,自动缩放ylim
为10**0
到10**1
,尽管数据仅位于图表的顶部。使用上面的解决方法,我可以增加ymax
,以便第三点完全在限制范围内,但我不知道如何增加 ymin
,以便减少空格在我的情节的下半部分。也就是说,关键在于我并不总是希望将我的极限分开,而是希望在我的所有点周围都有一些恒定(或比例)的缓冲区。
答案 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。