我想在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))
Run Code Online (Sandbox Code Playgroud)
我希望有一个单线或双线解决方案,每当我制作这样的情节时我都可以轻松使用.
为了弄清楚我在解决方法中做了什么,我应该在线性空间(而不是日志空间)中添加一个示例:
plot(xdata,ydata)
xmin,xmax = xlim()
xbuff = 0.1*(xmax-xmin)
xlim(xmin-xbuff,xmax+xbuff))
Run Code Online (Sandbox Code Playgroud)
这与前面的例子相同,但是对于线性轴.
一个相关的问题是有时限制太大.假设我的数据是ydata = xdata**0.25这样的,即范围的差异远小于十年,但结果恰好相反10**1.然后,自动缩放ylim是10**0到10**1尽管数据仅在图的顶部.使用上面的解决方法,我可以增加,ymax以便第三个点完全在限制范围内,但我不知道如何增加, ymin以便在我的情节的下半部分有更少的空白.也就是说,关键在于我并不总是希望将我的极限分开,而是希望在我的所有点周围都有一些恒定(或比例)的缓冲.
@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`
Run Code Online (Sandbox Code Playgroud)
值必须介于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')
Run Code Online (Sandbox Code Playgroud)
Obs.:这里的比例是有效的(0.1将在x范围和y范围之前和之后增加10%的缓冲区).
| 归档时间: |
|
| 查看次数: |
5886 次 |
| 最近记录: |