我使用matplotib的Axes API来绘制一些数字.我绘制的一条线代表理论预期线.它在原始y和x限制之外没有任何意义.我想要的是matlplotlib在自动缩放限制时忽略它.我以前做的是检查当前限制是什么,然后绘制并重置限制.问题在于,当我绘制第三个图时,限制会与理论线一起重新计算,这真的会扩展图形.
# Boilerplate
from matplotlib.figure import Figure
from matplotlib.backends.backend_pdf import FigureCanvasPdf
from numpy import sin, linspace
fig = Figure()
ax = fig.add_subplot(1,1,1)
x1 = linspace(-1,1,100)
ax.plot(x1, sin(x1))
ax.plot(x1, 3*sin(x1))
# I wish matplotlib would not consider the second plot when rescaling
ax.plot(x1, sin(x1/2.0))
# But would consider the first and last
canvas_pdf = FigureCanvasPdf(fig)
canvas_pdf.print_figure("test.pdf")
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 15
显而易见的方法是手动将限制设置为您想要的限制.(例如ax.axis([xmin, xmax, ymin, ymax])
)
如果你不想手动找出限制,你有几个选择......
有几个人(tillsten,Yann和Vorticity)提到过,如果你可以绘制最后想要忽略的函数,那么你可以在绘制它之前禁用自动缩放或者将scaley=False
kwarg 传递给plot
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x1 = np.linspace(-1,1,100)
ax.plot(x1, np.sin(x1))
ax.plot(x1, np.sin(x1 / 2.0))
ax.autoscale(False) #You could skip this line and use scalex=False on
ax.plot(x1, 3 * np.sin(x1)) #the "theoretical" plot. It has to be last either way
fig.savefig('test.pdf')
Run Code Online (Sandbox Code Playgroud)
请注意,您可以调整zorder
最后一个绘图,以便在"中间"绘制它,如果您想要控制它.
如果您不想依赖顺序,并且您确实想要根据自定义指定行列表,那么您可以执行以下操作:(注意:这是一个简化版本,假设您正在处理Line2D
对象,而不是matplotlib艺术家.)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
def main():
fig, ax = plt.subplots()
x1 = np.linspace(-1,1,100)
line1, = ax.plot(x1, np.sin(x1))
line2, = ax.plot(x1, 3 * np.sin(x1))
line3, = ax.plot(x1, np.sin(x1 / 2.0))
autoscale_based_on(ax, [line1, line3])
plt.show()
def autoscale_based_on(ax, lines):
ax.dataLim = mtransforms.Bbox.unit()
for line in lines:
xy = np.vstack(line.get_data()).T
ax.dataLim.update_from_data_xy(xy, ignore=False)
ax.autoscale_view()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
小智 7
LineCollection
可以使用参数忽略对象autolim=False
:
from matplotlib.collections import LineCollection
fig, ax = plt.subplots()
x1 = np.linspace(-1,1,100)
# Will update limits
ax.plot(x1, np.sin(x1))
# Will not update limits
col = LineCollection([np.column_stack((x1, 3 * np.sin(x1)))], colors='g')
ax.add_collection(col, autolim=False)
# Will still update limits
ax.plot(x1, np.sin(x1 / 2.0))
Run Code Online (Sandbox Code Playgroud)
使用scalex/scaley kw arg:
plot(x1, 3*sin(x1), scaley=False)
Run Code Online (Sandbox Code Playgroud)