我正在使用How to show data labels when you mouse over data处的示例创建一个图像,当您将鼠标悬停在点上时数据会出现。这样做效果很好,但是有一些方法可以保存它,所以我可以将图像发送给其他人吗?我不确定哪种格式支持“工具提示”,但pdf和svg都支持,也许还有其他方式?
如果我需要打包可执行文件,那么在linux中执行此操作的最简单方法是什么?
答案 0 :(得分:9)
可能有一些方法可以使用svg和一些javascript或pdf工具提示,正如你的建议(我不知道pdf工具提示是否存在,直到你提到它们。)。
顺便说一句,我应该花点时间提一下mpld3
,它使用d3
将matplotlib图重新创建为javascript可视化。它允许非常可共享的交互式数字,并且有一些制作交互式工具提示的示例。
但是,我不确定如何使matplotlib的svg文件通常具有交互性,你提到你不要去javascript路线,所以我会走你的路通过建立一个独立的"可执行文件(或者更确切地说,是具有可执行文件和相关库的目录)。
cx_freeze
和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发送给其他人。 (你可能想要做一些更有趣的事情。可以制作包含tarred数据,库和可执行文件的shell脚本,但我会在这里跳过那部分。)
setup.py
文件使用setup.py
。我们假设您有一个名为plot.py
的简单脚本,其中包含一些基本的绘图代码和一个名为data.csv
的文件,其中包含您要用matplotlib
绘制的数据等。 setup.py
的{{1}}文件看起来像这样:(另外,为了简单起见,我假设您正在使用Tk后端进行matplotlib。如果您和#的话,情况会略有不同39;不是。)
cx_freeze
这大部分是样板文件。关键部分是:
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)
)x_Freeze.Executable("plot.py", base = base)
中的"includes"
部分。 build_exe_options
会尝试自动猜测需要包含哪些模块,但有些情况下无法检测到所需的所有内容。本部分允许您指定要显式包含的其他模块。 matplotlib后端通常无法正确自动检测,因此您需要明确包含您正在使用的后端。cx_freeze
中的"include_files"
部分。这表示需要包含的任何其他数据文件。 Matplotlib有一些数据文件(图标等),需要与代码和库一起提供,以使事情正常运行。行build_exe_options
获取这些文件并将它们放在名为" mpl-data"的文件夹中。在构建目录中。同样,行(matplotlib.get_data_path(), "mpl-data")
获取您的" data.csv"将文件保存并在构建目录中使用相同的名称保存。我需要花一点时间来提及('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
,但是读取它的代码期望它位于当前目录中。
您有两种选择:
data.csv
进入目录(实际上,发送cd
的短脚本,运行程序,然后cd
退出。如果您不想打扰第二个选项,这可作为最后的手段。出于多种原因,第二个选项更好,但您必须稍微修改脚本(在这种情况下为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 originally的pd.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可能是最简单的路径。