java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本
2021/6/10 12:21:12
本文主要是介绍java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
写在前面,最近需要在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 np import matplotlib.pyplot as plt plt.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\Temp\1623292234356-0\exec.py,这个带的日志输出能看到,搞定 command.execute(Joiner.on('\n').join(scriptLines));
搞定。
这篇关于java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Java创意资料:新手入门的创意学习指南
- 2024-11-25JAVA对接阿里云智能语音服务资料详解:新手入门指南
- 2024-11-25Java对接阿里云智能语音服务资料详解
- 2024-11-25Java对接阿里云智能语音服务资料详解
- 2024-11-25JAVA副业资料:新手入门及初级提升指南
- 2024-11-25Java副业资料:入门到实践的全面指南
- 2024-11-25Springboot应用的多环境打包项目实战
- 2024-11-25SpringBoot应用的生产发布项目实战入门教程
- 2024-11-25Viite多环境配置项目实战:新手入门教程
- 2024-11-25Vite多环境配置项目实战入门教程