写在前面,最近需要在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);
所以想要更全面的用法还得自己动手,几种办法:
//拿到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);
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));
搞定。