使用Julia PyCall,在Julia模块中使用matplotlib.pyplot
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Julia PyCall,在Julia模块中使用matplotlib.pyplot相关的知识,希望对你有一定的参考价值。
我正在使用
- MacOS 10.13.6,High Sierra
- 从终端,julia - 版本产生julia版本1.0.1
- 从终端,python --version产生Python 2.7.15
- 从终端运行脚本
我有一个小朱莉娅脚本,在我通过谷歌搜索找到的fix后工作:
文件:standalone.jl(作品)
using PyCall
@pyimport matplotlib
matplotlib.use("TkAgg") # Required on Mac, otherwise I get an error: "-[NSApplication _setup:]: unrecognized selector sent to instance 0x7f85e1050280...."
@pyimport matplotlib.pyplot as plt
x = [1, 2]
y = [1, 2]
plt.figure()
plt.plot(x, y)
plt.show()
我想知道如何以下列方式将此脚本重新转换为模块文件和主文件(从documentation调整):
文件:getplt.jl
__precompile__() # this module is safe to precompile
module getplt
using PyCall
const plt = PyNULL()
const mpl = PyNULL()
function __init__()
copy!(plt, pyimport_conda("matplotlib.pyplot", "matplotlib"))
copy!(mpl, pyimport_conda("matplotlib", "matplotlib"))
end
end
文件:main.jl
push!(LOAD_PATH, "./")
using getplt
getplt.mpl[:use]("TkAgg") # Required on Mac
x = [1, 2]
y = [0, 2]
getplt.plt[:figure]
getplt.plt[:plot](x, y)
getplt.plt[:show]
当我尝试这样做时,我收到以下错误:
-[NSApplication _setup:]: unrecognized selector sent to instance 0x7f9e78221710
2018-10-30 16:11:44.897 julia[87599:2109977] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x7f9e78221710'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff4697f2db __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fff6db22c76 objc_exception_throw + 48
2 CoreFoundation 0x00007fff46a17db4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 CoreFoundation 0x00007fff468f5820 ___forwarding___ + 1456
4 CoreFoundation 0x00007fff468f51e8 _CF_forwarding_prep_0 + 120
5 libtk8.6.dylib 0x0000000134d5531d TkpInit + 413
6 libtk8.6.dylib 0x0000000134cad17e Initialize + 2622
7 _tkinter.cpython-37m-darwin.so 0x0000000134295a0f _tkinter_create + 1183
8 libpython3.7m.dylib 0x000000012201dc29 _PyMethodDef_RawFastCallKeywords + 681
9 libpython3.7m.dylib 0x000000012201dd2d _PyCFunction_FastCallKeywords + 45
10 libpython3.7m.dylib 0x0000000122127714 call_function + 612
11 libpython3.7m.dylib 0x000000012211e7fa _PyEval_EvalFrameDefault + 8138
12 libpython3.7m.dylib 0x000000012211c399 _PyEval_EvalCodeWithName + 3305
13 libpython3.7m.dylib 0x000000012201cb21 _PyFunction_FastCallDict + 481
14 libpython3.7m.dylib 0x000000012201e514 _PyObject_Call_Prepend + 164
15 libpython3.7m.dylib 0x0000000122085eda slot_tp_init + 298
16 libpython3.7m.dylib 0x000000012208f5d7 type_call + 295
17 libpython3.7m.dylib 0x000000012201d7e3 _PyObject_FastCallKeywords + 691
18 libpython3.7m.dylib 0x000000012212777c call_function + 716
19 libpython3.7m.dylib 0x000000012211e927 _PyEval_EvalFrameDefault + 8439
20 libpython3.7m.dylib 0x000000012201d3de function_code_fastcall + 254
21 libpython3.7m.dylib 0x0000000122127786 call_function + 726
22 libpython3.7m.dylib 0x000000012211e7fa _PyEval_EvalFrameDefault + 8138
23 libpython3.7m.dylib 0x000000012211c399 _PyEval_EvalCodeWithName + 3305
24 libpython3.7m.dylib 0x000000012201cb21 _PyFunction_FastCallDict + 481
25 libpython3.7m.dylib 0x000000012201e514 _PyObject_Call_Prepend + 164
26 libpython3.7m.dylib 0x000000012201ff24 method_call + 36
27 libpython3.7m.dylib 0x000000012201df26 PyObject_Call + 246
28 libpython3.7m.dylib 0x000000012211eb73 _PyEval_EvalFrameDefault + 9027
29 libpython3.7m.dylib 0x000000012211c399 _PyEval_EvalCodeWithName + 3305
30 libpython3.7m.dylib 0x000000012201d966 _PyFunction_FastCallKeywords + 230
31 libpython3.7m.dylib 0x0000000122127786 call_function + 726
32 libpython3.7m.dylib 0x000000012211e88e _PyEval_EvalFrameDefault + 8286
33 libpython3.7m.dylib 0x000000012201d3de function_code_fastcall + 254
34 libpython3.7m.dylib 0x0000000122127786 call_function + 726
35 libpython3.7m.dylib 0x000000012211e88e _PyEval_EvalFrameDefault + 8286
36 libpython3.7m.dylib 0x000000012211c399 _PyEval_EvalCodeWithName + 3305
37 libpython3.7m.dylib 0x000000012201d966 _PyFunction_FastCallKeywords + 230
38 libpython3.7m.dylib 0x0000000122127786 call_function + 726
39 libpython3.7m.dylib 0x000000012211e88e _PyEval_EvalFrameDefault + 8286
40 libpython3.7m.dylib 0x000000012211c399 _PyEval_EvalCodeWithName + 3305
41 libpython3.7m.dylib 0x000000012201cb21 _PyFunction_FastCallDict + 481
42 ??? 0x0000000121cad41a 0x0 + 4861907994
43 ??? 0x0000000121cb20c4 0x0 + 4861927620
44 ??? 0x0000000121cae6d4 0x0 + 4861912788
45 ??? 0x0000000121cae633 0x0 + 4861912627
46 libjulia.1.0.dylib 0x0000000104848ac3 jl_fptr_trampoline + 51
47 libjulia.1.0.dylib 0x00000001048594b2 jl_f__apply + 1218
48 ??? 0x0000000121cae4ee 0x0 + 4861912302
49 libjulia.1.0.dylib 0x0000000104848ac3 jl_fptr_trampoline + 51
50 libjulia.1.0.dylib 0x0000000104a0dab8 do_call + 200
51 libjulia.1.0.dylib 0x0000000104a0c5ac eval_body + 1228
52 libjulia.1.0.dylib 0x0000000104a0caf8 jl_interpret_toplevel_thunk_callback + 408
53 libjulia.1.0.dylib 0x000000010485f68c enter_interpreter_frame + 28
54 libjulia.1.0.dylib 0x00000001048796c2 jl_toplevel_eval_flex + 1282
55 libjulia.1.0.dylib 0x0000000104854ebf jl_parse_eval_all + 1279
56 libjulia.1.0.dylib 0x000000010487a9e3 jl_load_ + 115
57 sys.dylib 0x000000010d96c9fa japi1_include_relative_2907.clone_1.clone_2 + 1178
58 sys.dylib 0x000000010d45a18d japi1_include_3913.clone_1 + 189
59 sys.dylib 0x000000010d459ea0 japi1__start_2552.clone_1 + 704
60 julia 0x000000010483b48d true_main + 1341
61 julia 0x000000010483aecc main + 108
62 libdyld.dylib 0x00007fff6e73c015 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
signal (6): Abort trap: 6
in expression starting at /Users/.../main.jl:10
__pthread_kill at /usr/lib/system/libsystem_kernel.dylib (unknown line)
Allocations: 6553408 (Pool: 6552271; Big: 1137); GC: 14
Abort trap: 6
如果需要任何进一步的信息,请告诉我,非常感谢您克服此错误的任何帮助。
更新
我没有回答这个问题的暂定解决方案是简单地使用Plots包(它在模块内部工作)而不使用PyPlot。我暂时打开这个问题,因为我可能希望将来某个时候使用matplotlib.pyplot,我希望这个错误得到解决。
以下是PyPlot的代码和文档
https://github.com/JuliaPy/PyPlot.jl
我建议你使用PyPlot库。基于matplotlib.pyplot绘制Julia的绘图。
使用命令(在终端模式下执行此操作,IPython有时会崩溃)
使用Pkg
Pkg.add(“PyCall”)Pkg.add(“PyPlot”)
我认为这解决了你的问题Pkg.build(“PyCall”) Pkg.build( “PyPlot”)
使用PyCall 使用PyPlot
对不起,我的英语不好。
您不必使用PyPlot.jl
在Julia中使用matplotlib。
但是,您必须在通过PyCall调用任何matplotlib操作之前导入它。请按照以下步骤操作:
(1)使用Julia包管理器安装PyPlot
模块(按]
并运行添加PyPlot)
(2)在代码的开头添加一个新行:
using PyPlot
现在,对matplolib
的调用不会让朱莉娅崩溃。可能不需要行matplotlib.use("TkAgg")
(我没有Mac测试)。
这是一个带模块的MWE:
module M1
using PyCall
using PyPlot
@pyimport matplotlib.pyplot as pyplt
function makeplot()
pyplt.plot(1:10,(1:10).^2)
end
end
using Main.M1
M1.makeplot()
考虑到使用Plots.jl
进行绘图 - 这允许你在Julia中有一个代码可以绘制几个后端。在做出关于绘图的选择时,我总是觉得这个页面非常有用:http://docs.juliaplots.org/latest/backends/。
以上是关于使用Julia PyCall,在Julia模块中使用matplotlib.pyplot的主要内容,如果未能解决你的问题,请参考以下文章
Julia Plots: PyCall.PyError("PyImport_ImportModule\n\npyimport 找不到 Python 包 matplotlib.pyplot