与其他人分享来自 mpldatacursor 的图像

2023-12-06

我正在使用这个例子当鼠标悬停在数据上时如何显示数据标签制作当您将鼠标悬停在点上时会出现数据的图像。这确实很好用,但是有什么方法可以保存它以便我可以将图像发送给其他人吗?我不确定哪些格式支持“工具提示”,但 pdf 和 svg 都支持,也许还有其他方法?

如果我需要打包可执行文件,在 Linux 中最简单的方法是什么?


正如您所建议的那样,可能有一些方法可以使事情与 svg 和一些 javascript 或 pdf 工具提示一起工作(在您提到它们之前我不知道 pdf 工具提示存在!)。

顺便说一句,我应该花点时间提一下mpld3它使用以下命令将 matplotlib 图形重新创建为 javascript 可视化d3。它确实允许very可共享的交互式图形,并有一些制作交互式工具提示的示例。

但是,我不确定如何使 matplotlib 的 svg 文件通常具有交互性,并且您提到您不想走 javascript 路线,所以我将引导您构建一个“独立”可执行文件(或者更确切地说, ,一个包含可执行文件和关联库的目录)。

使用以下命令构建“独立”可执行文件cx_freeze and matplotlib

至少在打包可执行文件方面,我建议cx_freeze。还有很多其他选择(例如pyinstaller, py2exe, py2app等),但大多数都是特定于平台的,对我来说有点太“神奇”了。cx_freeze需要更多的知识才能使用,但它非常可靠,一旦您知道需要包含哪些内容,使用起来并不难。

首先,我将向您介绍的完整示例可在此处找到:https://gist.github.com/joferkington/9214844它使用您在之前问题中提供的示例脚本和数据。

关键是要建立一个setup.py正确引用 1) matplotlib 的数据文件和 2) 代码中需要包含的任何数据才能正确运行的文件。

之后,就很简单了python setup.py build_exe并 tar 它创建的构建目录以发送给其他人。 (您可能想做一些更奇特的事情。可以制作包含 tar 数据、库和可执行文件的 shell 脚本,但我将在这里跳过这一部分。)

制作setup.py file

setup.py。假设您有一个名为的简单脚本plot.py其中包含一些基本的绘图代码和一个名为data.csv与您想要绘制的数据matplotlib等。setup.py归档cx_freeze看起来像这样:(另外,为了简单起见,我假设您正在使用 matplotlib 的 Tk 后端。如果您没有使用,情况看起来会略有不同。)

import cx_Freeze
import sys
import matplotlib
base = None
if sys.platform == "win32":
    base = "Win32GUI"

executables = [
    cx_Freeze.Executable("plot.py", base = base),
    ]

build_exe_options = {"includes":["matplotlib.backends.backend_tkagg"],
                     "include_files":[(matplotlib.get_data_path(), "mpl-data"),
                                      ('data.csv', 'data.csv')],
                     "excludes":[],
                     }
cx_Freeze.setup(
    name = "script",
    options = {"build_exe": build_exe_options},
    version = "0.0",
    description = "A basic example",
    executables = executables)

其中大部分都是样板文件。关键部分是:

  1. 您的脚本的名称(x_Freeze.Executable("plot.py", base = base))
  2. The "includes"部分中的build_exe_options. cx_freeze会尝试自动猜测它需要包含哪些模块,但在某些情况下不可能检测到它需要的所有模块。此部分允许您指定要显式包含的其他模块。 matplotlib 后端通常无法正确自动检测,因此您需要显式包含您正在使用的后端。
  3. The "include_files"部分中的build_exe_options。这表示需要包含的任何其他数据文件。 Matplotlib 有一些数据文件(图标等),需要与代码和库一起提供才能正常运行。线路(matplotlib.get_data_path(), "mpl-data")获取这些文件并将它们放入构建目录中名为“mpl-data”的文件夹中。同样,该行('data.csv', 'data.csv')获取“data.csv”文件并将其以相同的名称保存在构建目录中。

我会花点时间提一下"excludes"选项。这完全是可选的,但是cx_freeze通常会包含许多脚本运行实际上不需要的库。如果您想缩小要分发的文件的大小,您可能需要列出要在此处排除的特定 python 模块。 (例如。"excludes":['PyQt4', 'scipy'])

其余部分是相当不言自明的。您可能需要填写描述、版本等,但这不是构建可执行文件所必需的。

Building

所以此时,我们有一个内容类似于以下内容的目录:

$ ls
data.csv  plot.py  setup.py

data.csv有我们的数据,plot.py是绘制它的脚本,并且setup.py如上所述。

要构建可执行文件,我们需要运行

python setup.py build_exe

您将获得很长的构建日志以及它正在复制的内容(可能还有一些在大多数情况下可以安全忽略的警告)。 (这是有用的信息,可用于调试您的问题setup.py file.)

完成后,您会注意到一个名为的新目录build.

$ ls
build  data.csv  plot.py  setup.py

在此刻,build将包含一个名为类似于以下内容的目录:

$ ls build
exe.linux-x86_64-2.7

The exe.whatever目录包含库、数据和可执行文件,您需要将它们分发给人们才能正确运行。

要查看它是否有效,请尝试(注意明确的cd进入目录!!稍后会详细介绍。):

$ cd build/exe.linux-x86_64-2.7
$ ./plot

(显然,如果你上面的文件没有被调用plot.py,可执行文件不会被调用plot,但你明白了。)

此时,您可以将exe.whatever目录(可能想在打包之前重命名),将其发送出去,并告诉人们通过解压和调用来运行它cd name_of_dir; ./plot.

关于数据路径的注意事项

我提到过我们目前需要明确cd在运行之前进入目录。这纯粹是因为以下事实:plot.py寻找一个名为data.csv 在当前目录下.

换句话说,有一行plot.py这样做:

df = pd.read_csv('data.csv', ...)

We made setup.py足够聪明,可以包括data.csv但读取它的代码期望它位于当前目录中。

您有两个选择:

  1. Always cd在运行脚本之前进入目录(实际上,发送一个简短的脚本cd进入,运行程序,并且cd退出)。如果您不想使用第二个选项,那么这作为最后的手段非常有用。
  2. 更改代码以引用相对于脚本位置的数据文件。

由于多种原因,第二个选项更好,但您必须修改脚本(plot.py,在这种情况下)稍微。

通常,您会使用路径__file__确定相对于脚本本身的位置。然而,随着cx_freeze, __file__不会被定义,你想要的路径是sys.executable反而。因此,您通常会执行以下操作:(来自 cx_freeze 常见问题解答:http://cx-freeze.readthedocs.org/en/latest/faq.html#data-files)

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)

在这种情况下,您需要修改代码:

pd.read_csv('data.csv', ...)

to do:

pd.read_csv(find_data_file('data.csv'), ...) 

反而。 (这在plot.py文件在g我最初链接到的。我将把它留给读者作为练习。)

一旦我们完成此操作,您就可以致电/path/to/where/the/directory/gets/copied/plot直接不管当前工作目录是什么。

分发

关于这个话题我不会说太多。有很多方法可以处理这个问题。和cx_freeze,您正在发送一个充满库和单个可执行文件的文件夹。

在最简单的情况下,您只需将其压缩,然后告诉人们解压并运行where/they/extracted/it/name_of_the_execuctable。您可能想要将文件夹重命名为exe.linux-x86_64-2.7更像是my_package并包含一个名为的 shell 脚本run_this或其他什么,但这取决于你。

在其他情况下,您可能想要编写一个包装脚本,甚至是一个.desktop文件。桌面文件必须有绝对路径,因此在这种情况下您需要做更多的事情。通常,您编写某种类型的安装程序脚本来修改whatever.desktop指向程序安装位置的绝对路径。

可以将压缩后的数据、库和可执行文件嵌入到“自解压”安装脚本中。如果您想深入了解,网上有一些示例。您还可以构建 .rpm 或 .deb。再次,我将跳过详细的示例,并将其留给您来解决。

总的来说,对于您似乎正在做的事情,发送 tarball 和 README 可能是最简单的途径。

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

与其他人分享来自 mpldatacursor 的图像 的相关文章

随机推荐

  • Meteor、MongoDB通过订阅获取部分数组

    我有一个关于如何使用 MongoDB 和 MeteorJS 获取数组的某个元素的问题 我的用户文档有以下架构 bankList id 34567890987654345678 name xfgchjbkn type credit id 09
  • 如何避免在无基础合并后必须合并存储库中的每个文件?

    我们在进行 TFS Baseless Merge 后遇到了一些麻烦 以下是我们目前拥有的分支机构的快速摘要 Main BranchA BranchB BranchA1 BranchB1 我们使用 特定版本之前的所有更改 进行了无根据的合并B
  • 如何向每个单元添加 UIActivity 指示器并保持对每个单独指示器的控制

    我正在尝试向 UITableView 中的某些单元格添加活动指示器 我在 didSelectRowAtIndexpath 方法中成功完成此操作 使用 CGRect CellFrame CGRectMake 260 10 20 20 acti
  • 如何在编辑(imagebutton)上绑定GridView的EditItemTemplate中的ASP.Net DropDownList控件单击[重复]

    这个问题在这里已经有答案了 我需要在 GridView 的 EditItemTemplate 中绑定 ASP Net DropDownList 控件 我有一个带有 commandname Edit 的编辑图像按钮 下拉列表也需要从不同的表
  • 在 XP 或 Vista/7 上的 VB.NET & WPF 或 WinForms 中向标题栏添加按钮(如 Firefox 4)

    我想知道是否可以在 vb net 中的标题栏添加一个按钮 我找到了一种在其中一个或另一个中执行此操作的方法 但是是否可以在两者上都执行此操作 以下是禁用 Aero 时有效的代码 导入 System RunTime InteropServic
  • 将带有表达式的字符串转换为十进制

    我有一个表 其中有一列 Faktor varchar 50 其中包含以下表达式 1 3 2 9 5 0 567 0 23 不 我正在寻找一种执行选择的方法 例如 select Faktor from Artikel 它应该返回带有值的十进制
  • 适用于 Chrome 的 Android ARC 应用程序,为不同的活动/布局设置窗口大小

    对于那些不知道什么是 ARC 的人 https developer chrome com apps getstarted arc 如何根据正在运行的活动或可见的布局手动设置窗口的大小 比如这个活动太高 太宽 虽然我希望下一个活动是全屏的 窗
  • 使用 .DrawToBitmap - 如何更改图像的分辨率?

    我在用着DrawToBitmap将一些标签保存为图像 我想知道如何改变这些图像的分辨率 有什么办法吗 假设我有一个带有文本的标签 我想将其渲染为图像文件 不发布完整代码 this label1 new System Windows Form
  • 使用 LibGit2Sharp 进行 Bitbucket 身份验证

    我使用 CSharp Bitbucket 库通过 Bitbucket 对用户进行身份验证 https github com scottksmith95 CSharp Bitbucket 身份验证工作正常 我得到了令牌值和令牌秘密值 我已经在
  • 无法在 xcode 中调整视图大小

    我似乎无法调整视图大小以填充模拟器中的屏幕 请参见下面的屏幕截图 注意顶部和底部的黑线 有谁知道我如何解决这个问题 Thanks Matt 此问题的原因是您尚未在项目中添加启动图像或故事板 您需要将启动图像添加到您的xcasset文件夹或者
  • C++ 中 i++++ 增量是什么

    谁能告诉我c 中i 自增的过程是什么 这是一个语法错误 使用最大咀嚼规则 i 被标记为 i 最后 是二元加法运算符 但显然它没有两个操作数 这会导致解析器错误 EDIT 评论中的问题 我们可以吗i j 它被标记为 i j 这又是一个语法错误
  • 跨多种语言的语义相似度

    我正在使用词嵌入来查找两个句子之间的相似性 使用 word2vec 如果一个句子是英语 另一个句子是荷兰语 我还可以获得相似性度量 尽管不是很好 所以我开始想知道是否可以计算两种不同语言的两个句子之间的相似度 没有明确的翻译 特别是如果这些
  • 通过命令行控制劳特巴赫

    我的条件是我必须将多个输出文件一一刷新到 mpc 控制器 我们使用lauterbach的GUI来进行软件的烧写和运行 现在我想通过 gt 命令行参数做同样的事情 请有人向我解释一下通过命令提示符控制劳特巴赫需要什么 我想使用 Lauterb
  • 使用 jQuery 切换下一个元素

    我有一个问题this元素 我知道如何this工作中 我有很多这样的 html 结构 当我点击 a 按钮时 带有 class 的 divextra options必须显示 但由于我在整个过程中重复了很多相同的 html 结构 因此当我单击按钮
  • 为什么我的自定义字体在某些浏览器中存在位置偏移?

    在我的网站 www monkey touch com 上工作时 我开始在标题和其他几个地方使用自定义字体 它看起来很棒 并且由于 font squirrel 它可以在所有浏览器上运行 然而 我后来意识到字体在某些浏览器中的呈现方式有所不同
  • 应用程序小部件中的 AdapterViewFlipper:setPendingIntentTemplate() 和 setOnClickFillInIntent() 不起作用

    我正在将应用程序小部件中的 ListView 更改为 AdapterViewFlipper 问题是 我需要处理对某个项目的点击 它可以完美地使用 setPendingIntentTemplate 将待处理的意图模板设置为整个 ListVie
  • 将 UIImageView 转换为 UIImage

    我正在处理图像 我有大量图像 并且我正在从服务器实时下载它们 然后使用AsyncImageView类 但知道我正在使用自定义类 这需要UIImage代替UIImageView 问题 有什么好的方法可以转换吗UIImageView to UI
  • 按下后退按钮时完成所有活动

    我有一个 Android 应用程序 有 3 个活动 对于第一个和第二个活动 我希望后退按钮退出所有现有活动 此时后退按钮正在退出它启动的活动 但如果在第二个活动上按下后退按钮 则将显示第一个活动 而不是退出应用程序 因为第一个活动会导致第二
  • Cloud Firestore 相当于实时数据库“.info/connected”参考吗?

    我已开始从 Firebase 实时数据库迁移到 Cloud Firestore 我需要一种方法 让应用程序在 Firestore 的连接状态发生变化时 从在线到离线 反之亦然 收到警报 为了清楚起见 我不需要将其写入数据库以供应用程序的其他
  • 与其他人分享来自 mpldatacursor 的图像

    我正在使用这个例子当鼠标悬停在数据上时如何显示数据标签制作当您将鼠标悬停在点上时会出现数据的图像 这确实很好用 但是有什么方法可以保存它以便我可以将图像发送给其他人吗 我不确定哪些格式支持 工具提示 但 pdf 和 svg 都支持 也许还有