从mpldatacursor与他人分享图片

时间:2014-02-25 17:09:53

标签: python pdf svg matplotlib

我正在使用How to show data labels when you mouse over data处的示例创建一个图像,当您将鼠标悬停在点上时数据会出现。这样做效果很好,但是有一些方法可以保存它,所以我可以将图像发送给其他人吗?我不确定哪种格式支持“工具提示”,但pdf和svg都支持,也许还有其他方式?

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

1 个答案:

答案 0 :(得分:9)

可能有一些方法可以使用svg和一些javascript或pdf工具提示,正如你的建议(我不知道pdf工具提示是否存在,直到你提到它们。)。

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

但是,我不确定如何使matplotlib的svg文件通常具有交互性,你提到你不要去javascript路线,所以我会走你的路通过建立一个独立的"可执行文件(或者更确切地说,是具有可执行文件和相关库的目录)。

建立一个独立的" cx_freezematplotlib

的可执行文件

至少在打包可执行文件方面,我建议cx_freeze。还有很多其他选项(例如pyinstallerpy2exepy2app等),但其中大多数都是针对特定平台的,并且有点太多"魔法"为了我的口味。 cx_freeze需要更多的知识才能使用,但它非常可靠,一旦您意识到需要包含的内容,就不会太难用。

首先,我将在此处提供完整的示例:https://gist.github.com/joferkington/9214844它使用您提供的示例脚本和数据作为早期问题的一部分。

关键是要构建一个setup.py文件,该文件正确引用1)matplotlib的数据文件; 2)您需要包含在代码中以使其正确运行的任何数据。

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

制作setup.py文件

使用setup.py。我们假设您有一个名为plot.py的简单脚本,其中包含一些基本的绘图代码和一个名为data.csv的文件,其中包含您要用matplotlib绘制的数据等。 setup.py的{​​{1}}文件看起来像这样:(另外,为了简单起见,我假设您正在使用Tk后端进行matplotlib。如果您和#的话,情况会略有不同39;不是。)

cx_freeze

这大部分是样板文件。关键部分是:

  1. 您的脚本名称(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)
  2. x_Freeze.Executable("plot.py", base = base)中的"includes"部分。 build_exe_options会尝试自动猜测需要包含哪些模块,但有些情况下无法检测到所需的所有内容。本部分允许您指定要显式包含的其他模块。 matplotlib后端通常无法正确自动检测,因此您需要明确包含您正在使用的后端。
  3. cx_freeze中的"include_files"部分。这表示需要包含的任何其他数据文件。 Matplotlib有一些数据文件(图标等),需要与代码和库一起提供,以使事情正常运行。行build_exe_options获取这些文件并将它们放在名为" mpl-data"的文件夹中。在构建目录中。同样,行(matplotlib.get_data_path(), "mpl-data")获取您的" data.csv"将文件保存并在构建目录中使用相同的名称保存。
  4. 我需要花一点时间来提及('data.csv', 'data.csv')选项。这完全是可选的,但"excludes"通常会包含许多库,这些库实际上并不是您的脚本运行所必需的。如果您想减小要分发的文件的大小,可能需要列出要在此处排除的特定python模块。 (例如cx_freeze

    其余部分相当不言自明。您可能需要填写说明,版本等,但不需要构建可执行文件。

    建筑

    所以在这一点上,我们有一个内容类似于以下内容的目录:

    "excludes":['PyQt4', 'scipy']

    $ ls data.csv plot.py setup.py 包含我们的数据,data.csv是绘制它的脚本,plot.py如上所述。

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

    setup.py

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

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

    build

    此时,$ ls build data.csv plot.py setup.py 将包含一个名为:

    的目录
    build

    $ ls build exe.linux-x86_64-2.7 目录包含您需要分发给人们才能正常运行的库,数据和可执行文件。

    要查看它是否有效,请尝试(请将explict exe.whatever注释到目录中!!稍后详细介绍。):

    cd

    (显然,如果您上面的文件没有被称为$ cd build/exe.linux-x86_64-2.7 $ ./plot ,则可执行文件不会被称为plot.py,但您明白了。)

    此时,您可以将plot目录(可能希望在tarring之前重命名),将其发送出去,并告诉人们通过解压并调用exe.whatever来运行它。

    关于数据路径的注意事项

    我提到我们目前需要在运行之前明确cd name_of_dir; ./plot到目录中。这纯粹是cd在当前目录中查找名为plot.py 的文件的结果。

    换句话说,data.csv中有一行代码:

    plot.py

    我们使df = pd.read_csv('data.csv', ...) 足够聪明以包含setup.py,但是读取它的代码期望它位于当前目录中。

    您有两种选择:

    1. 在运行脚本之前始终data.csv进入目录(实际上,发送cd的短脚本,运行程序,然后cd退出。如果您不想打扰第二个选项,这可作为最后的手段。
    2. 更改代码以引用相对于脚本位置的数据文件。
    3. 出于多种原因,第二个选项更好,但您必须稍微修改脚本(在这种情况下为cd)。

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

      sys.executable

      在这种情况下,您修改了以下代码:

      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', ...)
      

      代替。 (这还没有在g ist I linked to originallypd.read_csv(find_data_file('data.csv'), ...) 文件中完成。我将把它作为练习留给读者。)

      完成上述操作后,无论当前工作目录是什么,都可以直接致电plot.py

      分发

      我在这个话题上不会说太多。有很多方法可以解决这个问题。使用/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以指向程序安装位置的绝对路径。

      可以将涂焦的数据,库和可执行文件嵌入到自我提取的#34;安装脚本。如果你想挖掘它们,网上有一些例子。您还可以构建.rpm或.deb。再说一次,我将跳过详细的例子并留给你解决。

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