使matplotlib自动缩放忽略一些图

jar*_*ndl 9 python matplotlib

我使用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=Falsekwarg 传递给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)

请参阅此输出图像


til*_*ten 6

使用scalex/scaley kw arg:

plot(x1, 3*sin(x1), scaley=False)
Run Code Online (Sandbox Code Playgroud)

  • 该文档相当具有误导性......这并不符合您的想法。它暂时关闭自动缩放,但下一次绘图将根据所有先前的绘图重新缩放。换句话说,只有在最后一次调用“plot”时它才会起作用。 (2认同)