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

2024-03-17

在参加 Kaggle 比赛时,我遇到了一些奇怪的问题。 基本上,我正在尝试将 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

满足我的需求:我得到压缩大小

然而,当我从 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)

它纠正除轴之外的参数(和尺寸,我猜是因为轴不同):

[debug] ax=AxesSubplot(0.125,0.11;0.775x0.77)
[debug] fig_size= [6. 4.]
[debug] dpi= 72.0
[debug] np_drawing.size= 497664
[debug] shape= (288, 432, 4)
[debug] size= 8214

注意:我检查过库版本,它们是相同的。

因此,出现了多个问题:

  1. 为什么子图给出不同的轴、形状和分辨率?

  2. 如何校正轴?

  3. 如何在 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)

然后做你的情节。

无法测试这是否真正解决了不同渲染器大小的问题,因为该问题不包含可运行的例子 http://sscce.org.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyplot.subplots:python 和 jupyter 笔记本中的不同行为 的相关文章

随机推荐

  • 如何使用双括号初始化 Map of Map

    我确实明白双括号初始化有其自己的隐藏成本 仍然有可能的初始化方法Map
  • 如何判断库是使用 C++11 编译的

    如何判断某个 C 库是否已使用链接 c 11 标准 elf 二进制文件默认包含所使用的编译器版本的签名 现在 关于使用的编译器标志 如果 frecord gcc switches在编译时使用 然后 您可以在ELF可执行文件中找到签名 g f
  • 如何使用单点触摸更改 UISlider 值?

    我正在开发我的第一个 iOS 应用程序 其中包含UISlider 我知道当UISlider被拖拽 但对于我的应用程序 我需要通过一次触摸获取滑块的值 即如果我触摸某处UISlider a UILabel应该显示其正确的值 这样子可以吗 任何
  • 选择源代码控制系统:VSS 之后的逻辑下一步

    过去几个月我一直在使用 Git 并且很喜欢它 我研究了如何在企业环境中托管它 考虑到一个 10 人团队使用 Visual SourceSafe 使用 Coldfusion Powerbuilder PHP 和一些 NET 进行编程 令我惊讶
  • 如何使用 Apache POI 在 Word .docx 文件中正确生成 RSID 属性?

    我一直在使用 Apache POI 来操作 Microsoft Word docx 文件 即打开最初在 Microsoft Word 中创建的文档 对其进行修改 然后将其保存到新文档中 我注意到 Apache POI 创建的新段落缺少修订保
  • CVS:列出标签(或日期)之间更改的所有文件

    有没有办法列出CVS中两个标签之间发生更改的所有文件 每次我们发布版本时 我们都会向该版本中的所有文件应用一个标签 我想找到版本之间更改的所有文件 如果我能找到两个日期之间更改的所有文件 它也会起作用 我想这个命令会有帮助 cvs diff
  • 使用项目反应器 mergeWith() 运算符来实现“if/elseif/else”分支逻辑

    我正在尝试使用项目反应堆 mergeWith运算符以实现if elseif else分支逻辑如下所述 RxJS If Else 运算符在哪里 https rangle io blog rxjs where is the if else op
  • 来自两个派生类的多重继承

    我有一个充当接口的抽象基类 我有两个派生类 集 它们实现了抽象类的一半 一个 集合 定义与初始化相关的抽象虚拟方法 另一个 集合 定义与实际 工作 相关的方法 然后 我有派生类 它们使用多重继承来构造完全定义的类 并且本身不添加任何内容 所
  • 大虾:在PDF中打印unicode字符串

    我正在使用 Prawn 在 Rails 3 应用程序中生成 PDF 是否可以像在 HTML 视图中一样将 Unicode 字符串打印到 PDF 中 例如 in show html erb结果字形 同时 pdf text raw unicod
  • 加密且安全的 Docker 容器

    我们都知道无法开源并自由分发软件的情况 而我就处于其中一种情况 我有一个应用程序 它由许多二进制文件 从 C 源代码编译 和将其全部包装到系统中的 Python 代码组成 该应用程序曾经作为云解决方案工作 因此用户可以通过网络访问应用程序功
  • 使用 ws4py 创建自己的应用程序

    我使用 ws4py 创建了一个 Web 服务器套接字 它使用了cherrypy 当我使用连接到服务器时ip port它连接完美 并且能够通过多个浏览器聊天 但是当我尝试连接时ip port ws它也有效 但是 在我不使用连接后ws 我无法握
  • jQuery 中的多个选择器

    我正在尝试运行这段代码 input value OK value Recrutar value Criar id attack name btn click 因此 如您所见 我正在尝试选择一个值等于 OK 或 Recrutar 或 Cria
  • 为什么IntelliJ Idea找不到GO SDK的位置?

    我下载了go1 4 darwin amd64 osx10 8 tar gz https golang org dl 并将其解压到我的本地目录中 基于什么安装到自定义位置 https golang org doc install说我在环境变量
  • jQuery - 专注于 TR

    好的 所以我正在制作一个插件 允许在我的网站中内联编辑表格 到目前为止进展顺利 我已经完成了大部分工作 但我似乎无法正确地将焦点移出表格 因此 如果有人完成编辑并开始编辑新行或只是单击该行之外的内容 则应该保存并恢复正常 但是 如果我在行上
  • Android NumberPicker 隐藏递增和递减按钮

    我正在使用一个数字选择器 http developer android com reference android widget NumberPicker html并且目标是 API 11 及更高版本 3 0 及更高版本 因此我使用受支持的
  • 如何在 R 中加载以 HDF5 文件形式保存在 pandas 中的数据帧?

    我将 pandas 中的数据帧保存在 HDF5 文件中 import numpy as np import pandas as pd np random seed 1 frame pd DataFrame np random randn 4
  • 如何使用 Perl 的 XML::Twig 向子元素添加属性?

    我有一个像这样的 XML 字符串
  • phpstorm symfony2 缺少服务警告

    我已经为 Phpstorm 安装了 Symfony2 插件 但我无法让 IDE 查看这些现有服务或其他注入的对象 能否以某种方式修复这些问题 从而使警告消失 我遇到了类似的问题 建议仔细检查以下内容 正如 Marcel建议的 检查你的Sym
  • AngularJS v1.3 打破翻译过滤器

    在 Angular v1 2 中 我使用以下代码在应用程序中提供本地化字符串 var i18n angular module i18n i18n service i18n function http timeout A dictionary
  • pyplot.subplots:python 和 jupyter 笔记本中的不同行为

    在参加 Kaggle 比赛时 我遇到了一些奇怪的问题 基本上 我正在尝试将 am 图像的矢量表示形式转换为 png 文件 它在 iPython 中完美运行 代码如下 def drawing to np prepare data drawin