fel*_*lix 2 python pdf svg matplotlib
我正在使用如何在鼠标悬停在数据上时显示数据标签的示例,以便在鼠标悬停在点上时生成数据.这样做效果很好,但是有一些方法可以保存它,所以我可以将图像发送给其他人吗?我不确定哪种格式支持"工具提示",但pdf和svg都支持,也许还有其他方式?
如果我需要打包可执行文件,那么在linux中执行此操作的最简单方法是什么?
可能有一些方法可以使用svg和一些javascript或pdf工具提示,正如你的建议(我不知道pdf工具提示存在,直到你提到它们!).
mpld3顺便说一下,我应该花点时间提一下将matplotlib图重新创建为javascript可视化使用d3.它确实允许非常可共享的交互式图形,并且有一些制作交互式工具提示的示例.
但是,我不确定如何使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文件等.文件cx_freeze看起来像这样:(另外,为简单起见,我假设你'使用Tk后端进行matplotlib.如果不是,那么情况会略有不同.)
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)
Run Code Online (Sandbox Code Playgroud)
大多数是样板.关键部分是:
x_Freeze.Executable("plot.py", base = base))"includes"部分build_exe_options. cx_freeze将尝试自动猜测它需要包含哪些模块,但有些情况下无法检测到它需要的所有内容.本部分允许您指定要显式包含的其他模块.matplotlib后端通常无法正确自动检测,因此您需要明确包含您正在使用的后端."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'])
其余的是相当不言自明的.您可能希望填写说明,版本等,但不需要构建可执行文件.
所以在这一点上,我们有一个内容类似于以下内容的目录:
$ ls
data.csv plot.py setup.py
Run Code Online (Sandbox Code Playgroud)
data.csv有我们的数据,plot.py是绘制它的脚本,setup.py如上所述.
要构建可执行文件,我们将运行
python setup.py build_exe
Run Code Online (Sandbox Code Playgroud)
您将获得构建的长日志以及它正在复制的内容(可能伴随着一些警告,在大多数情况下可以安全地忽略).(这是用于调试setup.py文件错误的有用信息.)
完成后,您会注意到一个名为的新目录build.
$ ls
build data.csv plot.py setup.py
Run Code Online (Sandbox Code Playgroud)
此时,build将包含一个名为类似于的目录:
$ ls build
exe.linux-x86_64-2.7
Run Code Online (Sandbox Code Playgroud)
该exe.whatever目录包含您需要分发给人们的库,数据和可执行文件,以便正确运行.
要查看它是否有效,请尝试(请注意cd目录中的详细信息!稍后详细介绍.):
$ cd build/exe.linux-x86_64-2.7
$ ./plot
Run Code Online (Sandbox Code Playgroud)
(显然,如果上面plot.py的文件没有被调用plot,则不会调用可执行文件,但是你明白了.)
此时,您可以对exe.whatever目录进行tar (可能希望在tarring之前重命名),将其发送出去,并告诉人们通过解压缩和调用来运行它cd name_of_dir; ./plot.
我提到我们目前需要cd在运行之前明确地进入目录.这纯粹是plot.py查找data.csv 当前目录中调用的文件的结果.
换句话说,有一条线plot.py:
df = pd.read_csv('data.csv', ...)
Run Code Online (Sandbox Code Playgroud)
我们已经setup.py足够聪明地包含data.csv但是读取它的代码期望它在当前目录中.
您有两种选择:
cd在运行脚本之前始终进入目录(实际上,发送一个简短的脚本cd,运行程序,然后cd退出).如果您不想打扰第二个选项,这可作为最后的手段.出于多种原因,第二种选择更好,但您必须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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将修改您的代码:
pd.read_csv('data.csv', ...)
Run Code Online (Sandbox Code Playgroud)
去做:
pd.read_csv(find_data_file('data.csv'), ...)
Run Code Online (Sandbox Code Playgroud)
代替.(这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并包含一个名为run_this或者其他的shell脚本,但这取决于您.
在其他情况下,您可能希望编写包装脚本甚至.desktop文件.桌面文件必须具有绝对路径,因此在这种情况下您需要做更多的工作.通常,您编写某种类型的安装程序脚本,该脚本会进行修改whatever.desktop以指向程序安装位置的绝对路径.
可以将tarred数据,库和可执行文件嵌入到"自解压"安装脚本中.如果你想挖掘它们,网上有一些例子.您还可以构建.rpm或.deb.再说一遍,我将跳过详细的例子,并留给你弄清楚.
总的来说,对于你似乎正在做的事情,发送tarball和README可能是最简单的方法.
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |