java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本

java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本,第1张

概述写在前面,最近需要在java中调用matplotlib,其他一些画图包都没这个好,毕竟python在科学计算有优势。找到了matplotlib4j,大概看了下github上的https://github.com/sh0nk/matplotlib4j,mavenrepository:<dependency><groupId>com.github.sh0nk</groupId><artifactId>m

写在前面,最近需要在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脚本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1184954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存