本人在学习完制做双波源干涉现象的的二维Contour Plots图像以后,发现 plotly 还有3D 图像制做,也就是3D Surface Plots,这个更能展现双波源干涉现象的结果,果真学之。中间有些地方要说明一下,3D Surface Plots图表默认的底部是正方形,因此我采用了100*100的干涉图,而后加上一层透明的图标,让图像压扁,否则图标的上下限就是波动位置,看起来很是不雅观。html
下面分享代码和结果:java
下面是 python部分的代码:python
#!/usr/bin/python # coding=utf-8 import plotly.plotly z = [] with open("/Users/Vicky/Documents/workspace/fission/long/intervene.log") as apidata: for i in apidata: data = i.split("\n")[0].split(",") z.append(data) matrix = [[20 for zij in zi] for zi in z]#为了让立体图压扁 plotly.offline.plot([ dict( z=z, type="surface" ), dict( z=matrix, showscale=False, opacity=0.01,#透明度 type="surface" ) ], filename="2222.html")
下面是 java 部分的代码,是为了生成数据:编程
package practise; import java.awt.Point; import java.util.ArrayList; import java.util.List; import source.SourceCode; public class Intervene extends SourceCode { public List<List<Double>> data = new ArrayList<>(); public static void main(String[] args) { Intervene intervene = new Intervene(); intervene.testDemo001(); } public void testDemo001() { Point point1 = new Point(25, 25); Point point2 = new Point(75, 75); int lamda = 6; for (int i = 0; i < 100; i++) {// y 轴 List<Double> distance = new ArrayList<>(); for (int j = 0; j < 100; j++) {// x 轴 Point point = new Point(j, i); double x = point.distance(point1) % lamda / lamda; double y = point.distance(point2) % lamda / lamda; double xx = Math.sin(x * 2 * Math.PI); double yy = Math.sin(y * 2 * Math.PI); distance.add(xx + yy); } data.add(distance); } StringBuffer content = new StringBuffer(); int size = data.size(); for (int i = 0; i < size; i++) { String text = data.get(i).toString(); text = text.substring(1, text.length() - 1); if (i == 0) content.append(text); content.append(LINE + text); } logLong("intervene.log", content.toString()); } }
下面是3D Surface Plots图的截图: api