使matplotlib自动缩放忽略某些图

发布于 2021-01-29 14:55:20

我使用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")
关注者
0
被浏览
216
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    显而易见的方法是手动将限制设置为所需的值。(例如ax.axis([xmin, xmax, ymin, ymax])

    如果您不想手动查找限制,则有两种选择…

    正如几个人(耕作,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')
    

    请注意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()
    

    在此处输入图片说明



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看