Matplotlib pyplot.subplot:python和jupyter笔记本中的不同行为

Matplotlib pyplot.subplot:python和jupyter笔记本中的不同行为,matplotlib,Matplotlib,在参加卡格尔比赛时,我遇到了一些奇怪的问题。 基本上,我正在尝试将am图像的矢量表示转换为png文件。它在iPython中运行良好,代码如下: def drawing_to_np_prepare_data(drawing): drawing = eval(drawing) fig, ax = plt.subplots() plt.close(fig) print('[debug] ax=',ax) for x,y in drawing: a

在参加卡格尔比赛时,我遇到了一些奇怪的问题。 基本上,我正在尝试将am图像的矢量表示转换为png文件。它在iPython中运行良好,代码如下:

def drawing_to_np_prepare_data(drawing):
    drawing = eval(drawing)
    fig, ax = plt.subplots()
    plt.close(fig)
    print('[debug] ax=',ax)
    for x,y in drawing:
        ax.plot(x, y, marker='.')
        ax.axis('off')
    fig.canvas.draw()

    # Convert images to numpy array
    np_drawing = np.array(fig.canvas.renderer._renderer)

    print('[debug] fig_size=',fig.get_size_inches())
    print('[debug] dpi=',fig.dpi)

    print('[debug] shape=',np_drawing.shape)
    print('[debug] size=',np_drawing.size)
    print('[debug] shape=',np_drawing.shape)

    im = cv2.cvtColor(np_drawing.astype(np.uint8), cv2.COLOR_BGR2RGB)

    # compress
    compressed_array = io.BytesIO()
    np.savez_compressed(compressed_array, im)
    compressed_array.seek(0)
    print('[debug] size=',np_drawing.shape)
    return compressed_array 
结果表明:

[debug] ax=AxesSubplot(0.125,0.125;0.775x0.755)
[debug] fig_size= [6. 4.]
[debug] dpi= 72.0
[debug] np_drawing.size= 497664
[debug] shape= (288, 432, 4)
[debug] size= 1880
这满足了我的需要:我得到了一个压缩大小<2Kb的图像

但是,当我从CLI在python中运行此代码时,得到的结果却截然不同:

[debug] ax=AxesSubplot(0.125,0.11;0.775x0.77)
[debug] fig_size= [6.4 4.8]
[debug] dpi= 100.0
[debug] np_drawing.size= 1228800
[debug] shape= (480, 640, 4)
[debug] size= 13096
如您所见,图形大小、dpi、轴不同,因此,末端的大小也不同

我可以将参数传递给子地块:

plt.subplots(figsize=(6.,4.), dpi=72)
除了轴(和尺寸,我想是因为不同的轴):

注意:我已经检查了库版本,它们是相同的

因此,出现了多个问题:

  • 为什么子地块提供不同的轴、形状和分辨率

  • 如何校正轴

  • 如何在python中获得相同的行为


  • 我想知道到底发生了什么。谢谢

    要在脚本中获得与笔记本中完全相同的设置,请打开笔记本,运行

    %matplotlib inline
    %config InlineBackend.rc
    
    它将打印rcParams的字典

    {'figure.figsize': (6.0, 4.0),
     'figure.facecolor': (1, 1, 1, 0),
     'figure.edgecolor': (1, 1, 1, 0),
     'font.size': 10,
     'figure.dpi': 72,
     'figure.subplot.bottom': 0.125}
    
    将它们复制到python文件中,如下所示:

    newrc = {'figure.figsize': (6.0, 4.0),
             'figure.facecolor': (1, 1, 1, 0),
             'figure.edgecolor': (1, 1, 1, 0),
             'font.size': 10,
             'figure.dpi': 72,
             'figure.subplot.bottom': 0.125}
    
    import matplotlib.pyplot as plt
    plt.rcParams.update(newrc)
    
    然后做你的阴谋


    无法测试这是否确实解决了不同渲染器大小的问题,因为问题不包含。若要在脚本中获得与笔记本中完全相同的设置,请打开笔记本,然后运行

    %matplotlib inline
    %config InlineBackend.rc
    
    它将打印rcParams的字典

    {'figure.figsize': (6.0, 4.0),
     'figure.facecolor': (1, 1, 1, 0),
     'figure.edgecolor': (1, 1, 1, 0),
     'font.size': 10,
     'figure.dpi': 72,
     'figure.subplot.bottom': 0.125}
    
    将它们复制到python文件中,如下所示:

    newrc = {'figure.figsize': (6.0, 4.0),
             'figure.facecolor': (1, 1, 1, 0),
             'figure.edgecolor': (1, 1, 1, 0),
             'font.size': 10,
             'figure.dpi': 72,
             'figure.subplot.bottom': 0.125}
    
    import matplotlib.pyplot as plt
    plt.rcParams.update(newrc)
    
    然后做你的阴谋


    无法测试这是否真的解决了不同渲染器大小的问题,因为问题不包含一个。

    酷,它起作用了。如何在python中运行以下命令:%matplotlib inline%config InlineBackend.rc?我想看看有什么区别。python不会更改rcParams,所以您可以直接打印它们,
    print(plt.rcParams)
    。很好,它成功了。如何在python中运行以下命令:%matplotlib inline%config InlineBackend.rc?我想看看有什么区别。python不会更改rcParams,所以您可以直接打印它们,
    print(plt.rcParams)