写在前面,最近需要在java中调用matplotlib,其他一些画图包都没这个好,毕竟python在科学计算有优势。找到了matplotlib4j,大概看了下github上的https://github.com/sh0nk/matplotlib4j,maven repository:
<dependency> <groupID>com.github.sh0nk</groupID> <artifactID>matplotlib4j</artifactID> <version>0.5.0</version></dependency>
简单贴个测试类,更多的用法在test报下有个MainTest.class。
@Test public voID testPlot() throws IOException, PythonExecutionException, ClassNotFoundException, NoSuchMethodException, illegalaccessexception, InvocationTargetException, InstantiationException { Plot plot = Plot.create(PythonConfig.pythonBinPathConfig("D:\\python3.6\\python.exe")); plt.plot() .add(Arrays.asList(1.3, 2)) .label("label") .linestyle("--"); plt.xlabel("xlabel"); plt.ylabel("ylabel"); plt.text(0.5, 0.2, "text"); plt.Title("Title!"); plt.legend(); plt.show(); }
下面问题来了,这个对matplotlib的封装不是很全面,源码里也有很多todo,有很多函数简单用用还行,很多重载用不了,比如plt.plot(xdata,ydata)可以,但是无法在其中指定字体plt.plot(xdata,ydata,Fontsize=30);
所以想要更全面的用法还得自己动手,几种办法:
大部分还是用matplotlib4j中的,个别的自己需要的但里头没有的函数,实现他的builder接口,重写build方法,返回一个py文件中命令行的字符串形式,然后反射取到PlotImpl中的成员变量registeredBuilders,往后追加命令行,感觉适用于只有极个别命令找不到的情况,挺麻烦的,而且要是传nd.array(…)这种参数还得额外拼字符串。//拿到plotImpl中用于组装python脚本语句的的registeredBuilders,需要加什么直接添加新的builder就行了 FIEld registeredBuildersFIEld = plt.getClass().getDeclaredFIEld("registeredBuilders"); registeredBuildersFIEld.setAccessible(true); List<Builder> registeredBuilders = (List<Builder>) registeredBuildersFIEld.get(plt); TicksBuilder ticksBuilder = new TicksBuilder(yList, "yticks", FontSize); registeredBuilders.add(ticksBuilder);
这种比较直接,参照matplotlib4j底层,直接写py.exe文件,执行命令行,比较推荐这种,一行一行脚本自己写,数据拼装方便,看起来直观。比如写如下的脚本并执行,搞两组数据,画个散点图import numpy as npimport matplotlib.pyplot as pltplt.plot(np.array(自己的x数据), np.array(自己的y数据), 'k.', markersize=4)plt.xlim(0,6000)plt.ylim(0,24)plt.yticks(np.arange(0, 25, 1), Fontsize=10)plt.Title("waterfall")plt.show()
像下面这么写就行了
//1. 准备自己的数据 不用管 List<float> y_secondList_formatByHours = y_secondList.stream().map(second -> (float)second / 3600).collect(Collectors.toList()); //2.准备命令行List,逐行命令添加 List<String> scriptlines = new ArrayList<>(); scriptlines.add("import numpy as np"); scriptlines.add("import matplotlib.pyplot as plt"); scriptlines.add("plt.plot("+"np.array("+x_positionList+"),"+"np.array(" +y_secondList_formatByHours+"),\"k.\",label=\"waterfall\",lw=1.0,markersize=4)"); scriptlines.add("plt.xlim(0,6000)"); scriptlines.add("plt.ylim(0,24)"); scriptlines.add("plt.yticks(np.arange(0, 25, 1), Fontsize=10)"); scriptlines.add("plt.Title(\"waterfall\")"); scriptlines.add("plt.show()"); //3. 调用matplotlib4j 里面的pycommond对象,传入自己电脑的python路径 pycommand command = new pycommand(PythonConfig.pythonBinPathConfig("D:\python3.6\python.exe")); //4. 执行,每次执行会生成临时文件 如C:\Users\adminI~1\AppData\Local\Temp23292234356-0\exec.py,这个带的日志输出能看到,搞定 command.execute(Joiner.on('\n').join(scriptlines));
以上是内存溢出为你收集整理的java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本全部内容,希望文章能够帮你解决java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)