【问题标题】:subplots by hand in matplotlib在 matplotlib 中手动绘制子图
【发布时间】:2017-08-11 06:18:04
【问题描述】:

手工绘制子图。

我指的是以下链接

http://nbviewer.jupyter.org/github/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.08-Multiple-Subplots.ipynb

创建坐标区的最基本方法是使用 plt.axes 函数。正如我们之前所见,默认情况下,这会创建一个填充整个图形的标准坐标区对象。 plt.axes 还接受一个可选参数,它是图形坐标系中四个数字的列表。这些数字代表图形坐标系中的[left,bottom,width,height],范围从图形左下角的0到图形右上角的1。

例如,我们可以通过将 x 和 y 位置设置为 0.65(即从图形宽度的 65% 和高度的 65% 开始)来在另一个轴的右上角创建一个插入轴) 和 x 和 y 的范围为 0.2(即轴的大小是图形宽度的 20% 和高度的 20%):

ax1 = plt.axes()  # standard axes
ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])

在上面的示例中,我期望 ax2 位于开始 (0.65,0.65) 的位置,因为我们的底部和左侧位于 0.65 和 0.65,但我正在观察 (0.65, 0.7) 并且长度和高度为 0.2,即位置的右垂直线0.85 但我观察到 0.9?为什么会有这种差异。请解释一下。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    plt.axes 的数字以图形为单位,其中图形为 1 个单位宽和 1 个单位高。
    让我只强调重要的部分:

    例如,我们可以通过将 x 和 y 位置设置为 0.65(即从宽度的 65% 和高度的 65% 开始)在另一个轴的右上角创建一个插入轴 图的宽度),x 和 y 的范围为 0.2(即轴的大小为 图的宽度的 20% 和高度的 20%

    也许一张图片有助于更多地理解这一点


    也就是说,当这段代码与 IPython 或 jupyter 中的内联后端一起使用时,有一点微妙之处。在这种情况下,输出中显示的图形大小可能与原始图形略有不同,因为它被裁剪或扩展以很好地适应内部绘制的所有内容。这相当于savefigbbox_to_inched="tight" 选项。因此,如果您想验证子图确实放置在图形大小的 65% 并且大 20%,则需要将代码作为脚本运行在笔记本之外,或者保存图形plt.savefig("test.png")(不使用bbox_to_inched="tight" 选项)。

    最后一点:虽然add_axes 可能是在图形坐标中添加轴的简单选项,但通常希望在轴坐标中添加插图,即以轴宽度和高度的百分比而不是图形宽度和高度。这可以按如下方式完成:

    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
    
    fig, ax1 = plt.subplots()
    
    ax2 = plt.axes([0, 0, 1, 1])
    ip = InsetPosition(ax1, [0.4, 0.1, 0.3, 0.7]) 
                            #posx, posy, width, height in coordinates of ax1
    ax2.set_axes_locator(ip)
    
    ax2.plot([1,2,3,4])
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2022-08-16
      • 2012-02-26
      • 2019-02-05
      • 1970-01-01
      • 2021-10-30
      • 2021-11-06
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多