`
tanling8334
  • 浏览: 3557 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA三维可视化组件:Matplot 3D for JAVA(V3.0) 一个纯JAVA开发的科学数据可视化组件包 类似 Python 的matplotlib

阅读更多

概述

Matplot3D for JAVA(V3.0) 是一个基于JAVA SE 1.8环境开发的三维数学图形图表组件。 组件由纯JAVA SE 实现(Pure Java) ,封装为一个jar包,jar文件大小不超过300KB。内含自主研发的三维几何造型、绘制算法,无需依赖OpenGL、DriectX、JAVA 3D或JAVAFX等等第三方库,其只依托JRE自带的类库即可(即只需安装了JAVA就可使用),可以非常方便的将Matplot3D for JAVA(V3.0)显示面板嵌入到自己JAVA GUI程序中。类似 Python 的matplotlib

本组件提供简单的外观API,可以方便生成三维效果的图形图表。可用于大数据可视化、科学数据分析可视化等领域。在使用GUI显示时支持鼠标等输入设备交互式操作,可方便的缩放和改变观察角度。支持动态编程,可实时生成三维模型动态改变动画。也可以根据输入的数据直接生成图片文件,这可用于动态Web的服务端,从页面传入的数据生成图像文件,返回给页面显示。

 

组件下载及项目地址:

码云:      https://www.gitee.com/tanling8334/Matplot3D-for-Java

Github:  https://github.com/tanling8334/Matplot3D-for-Java

 

完整API请参看上面连接中的Readme.md文档,其中的demo结尾的.jar文件是可执行文件,实际开发使用时不需要引用。请在安装了64位java的系统中运行,运行demo可以看到实际效果和示例代码。实测在JAVA8和JAVA17上使用效果较好。欢迎大家推广使用和交流。

作者联系方式:

email : ta8334@126.com  QQ : 17746302

 

效果展示:

​地形数据可视(动图) 

 引擎功能展示 地球(动图)

 引擎功能展示 珠峰(动图)

 

 数据阵列:

数据阵列 示例代码:

 

 

 

import java.util.Random;

import tanling.matplot3d.app.facade.DataGridProcessor;
import tanling.matplot3d.app.facade.Matplot3D4JMgr;
import tanling.matplot3d.common.Range;
import tanling.matplot3d.d3d.color_style.ColorStyle;
import tanling.matplot3d.d3d.color_style.TopBottomColorStyle;

public class DataGridDemo {
	public static void main(String[] args) {
		DataGridProcessor processor = new DataGridProcessor();
		
		final Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);		
		
		//=======================================
		//准备你的数据,是一个二维Double数组。表示均匀分布的网格点,数组内的值表示高度
		//数据一般来源于具体应用的非规则函数数据,例如某区域的DEM地形高程数据
		//以下代码创造一些虚拟数据用于展示如何使用
		
		Double[][] datas=new Double[20][20];
		
		Random random=new Random();
		
		for(int i=0;i<datas.length;i++) {
			for(int j=0;j<datas[0].length;j++) {
				
				if(i+j<20)
					datas[i][j]=(double)i+j+random.nextDouble();
				else 
					datas[i][j]=40d-i-j-random.nextDouble();
				
			}
		}
		//=======================================
		
		
		//创建一个颜色风格
		ColorStyle cs = new TopBottomColorStyle(ColorStyle.DEFAULT_COLORS_ARRAY);

		mgr.setCoordianteSysShowType(Matplot3D4JMgr.COORDINATE_SYS_ALWAYS_FURTHER);
		
		processor.setClose3DObject(true);//设置是否是封闭三维对象

		mgr.setScaleX(1);
		mgr.setScaleY(1);
		mgr.setScaleZ(1.2);

		mgr.setTitle("Demo 数据阵列");

		processor.setShowGrid(false);//是否现显示辅助网格线

		processor.addData(datas, "", new Range(0, 100), new Range(100, 200), 20, 20, cs, 1f);
		
		mgr.show();
	}
}

 

 

点云 :

 

 引擎功能展示 珠峰: 

 函数曲面:

 函数曲面示例代码

 

 

 

import tanling.matplot3d.app.facade.Function;
import tanling.matplot3d.app.facade.FunctionProcessor;
import tanling.matplot3d.app.facade.Matplot3D4JMgr;
import tanling.matplot3d.common.Range;

public class FunctionSurfaceDemo {

	public static void main(String[] args) {

		FunctionProcessor processor = new FunctionProcessor();
		
		final Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);		

		//定义二维函数,根据xy值求y值
		Function f = new Function() {
			public Double f(double x, double y) {
				return Math.sin(y * x / 2.2) * 0.8;
			}
		};

		double pi = Math.PI;

		//将二维函数加入处理器,设置XY方向显示范围和采样分段数
		//可以加入多个函数
		processor.addData(f, "", new Range(-1.5*pi, 1.5*pi), new Range(-1.5*pi, 1.5*pi), 60, 60);

		mgr.setScaleZ(1.5);
		mgr.setScaleX(1.3);
		mgr.setScaleY(1.3);

		mgr.setSeeta(1.3);
		mgr.setBeita(1.1);

		mgr.setTitle("Demo : 函数曲面绘制   [ z =  0.8 * sin(y*x/2.2) ]");

		mgr.setCoordianteSysShowType(mgr.COORDINATE_SYS_ALWAYS_FURTHER);

		mgr.show();

	}

}

 

 

混合数据: 

 浮雕效果:

 散点:

 云图:

云图示例代码:

 

 

 

import java.awt.Color;
import java.util.Random;

import tanling.matplot3d.app.facade.ContourDataGridProcessor;
import tanling.matplot3d.app.facade.Matplot3D4JMgr;
import tanling.matplot3d.common.Range;

public class ContourDataGridDemo {
	public static void main(String[] args) {
		
		ContourDataGridProcessor processor = new ContourDataGridProcessor();
//		DataGridProcessor processor = new DataGridProcessor();
		
		 Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);		
		
		//=======================================
		//准备你的高度数据,是一个二维Double数组。表示均匀分布的网格点,数组内的值表示高度
		//数据一般来源于具体应用的非规则函数数据,例如某区域的DEM地形高程数据
		//以下代码创造一些虚拟数据用于展示如何使用
		
		Double[][] datas=new Double[100][100];
		
		Random random=new Random();
		
		for(int i=0;i<datas.length;i++) {
			for(int j=0;j<datas[0].length;j++) {
		
				datas[i][j]=-0.1*Math.pow(100d-i-j,2)+1000;
				
			}
		}
		//=======================================
		
		//=======================================
		//准备你的显示数据values,是一个二维Double数组,。表示均匀分布的网格点,数组内的值表示非xyz的第四维标量数据
		//values的行列分布可以不与datas一致,但建议最好一致以优化显示效果
		//以下代码创造一些虚拟数据用于展示如何使用
		
		Double[][] values=new Double[50][50];
		for(int i=0;i<values.length;i++) {
			for(int j=0;j<values[0].length;j++) {
				
					double temp=Math.sqrt(Math.pow(i-25d,2)+Math.pow(j-25d,2));
					
//					if(temp<15)
						values[i][j]=temp;

			}
		}
		//=======================================

		mgr.setCoordianteSysShowType(Matplot3D4JMgr.COORDINATE_SYS_ALWAYS_FURTHER);
		
		processor.setClose3DObject(true);//设置是否是封闭三维对象

		mgr.setScaleX(5);
		mgr.setScaleY(5);
		mgr.setScaleZ(0.2);

		mgr.setTitle("Demo 二维云图");

		processor.setShowGrid(false);//是否现显示辅助网格线

		Color baseColor=Color.GRAY;//云图需要一个基色
		
		processor.addData(datas, values,baseColor, "my_name", new Range(0, 100), new Range(100, 200), 20, 20, 1f);
		
		mgr.show();
	}
}

 

 

折线:

 折线图示例代码:

 

 

 

import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import tanling.matplot3d.app.facade.LineChartProcessor;
import tanling.matplot3d.app.facade.Matplot3D4JMgr;

public class LineChart2dsDemo {

	public static void main(String[] args) {

		LineChartProcessor processor = new LineChartProcessor();

		Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);		
		
		Random ra = new Random();

//		int groupCount = 5;

		int pointCount = 25;

		//==================================================
		//在此准备数据
		//折线图中所有平面中二维点由Point2D.Double表示,按照顺序放入List<Point2D.Double>中
		//prepare your data here
		
		List<Point2D.Double>[] targets = new ArrayList[pointCount];

		// 设置最终的数据
		for (int c = 1; c <= targets.length; c++) {

			List<Point2D.Double> li = new ArrayList<Point2D.Double>();
			targets[c - 1] = li;

			for (int i = 0; i < pointCount; i++) {
				li.add(new Point2D.Double(i, i * c * 0.05 + (ra.nextDouble() * 0.8)));
			}
		}

		//将数据加入处理器
		processor.addData("Item系列 1", null, targets[0]);
		processor.addData("Item系列 2", null, targets[1]);
		processor.addData("Item系列 3", null, targets[2]);
		processor.addData("Item系列 4", null, targets[3]);
		processor.addData("Item系列 5", null, targets[4]);

		mgr.setBeita(4.3);
		mgr.setSeeta(0.3);

		mgr.setScaleY(1); 
		mgr.setScaleX(1);
		mgr.setScaleZ(1.6);// 拉伸Z方向,使图形显得更高

		mgr.setTitle("Demo : 多层2维折线图");
		
		mgr.setRulerYVisable(false);
		
		mgr. setXName("X_月份");
		mgr. setZName("Z_指标");

		mgr. setRulerTextColor(new Color(11, 79, 107));
		mgr. setRulerTextFont(new Font("方正正楷", Font.PLAIN, 13));
		
		mgr. setAxisNameTextColor(new Color(138, 171, 205));

		// 自定义标尺(使标尺不使用默认的数量进行显示)
		String[] labels = new String[13];	
		double[] positions = new double[13];

		labels[0] = "    2019    "; // 加入空格会扩大文字和标尺的距离
		positions[0] = 0;

		for (int i = 2; i < pointCount; i += 2) {
			labels[i / 2] = i / 2 + "月";
			positions[i / 2] = i;
		}

		mgr. setRulerLabelsX(labels, positions);//设置X方向标尺自定义可读文字

		mgr. setRulerYVisable(false);//不显示Y方向标尺

		mgr. setCoordianteSysShowType(Matplot3D4JMgr.COORDINATE_SYS_STABLE);

		mgr.show();
	}
}

 

 

柱状图:

柱状图示例代码:

 

 

 

import java.util.Random;

import tanling.matplot3d.app.facade.HistogramProcessor;
import tanling.matplot3d.app.facade.Matplot3D4JMgr;

public class BarsDemo {

	public static void main(String[] args) {

		HistogramProcessor processor = new HistogramProcessor();
		
		Matplot3D4JMgr mgr=new Matplot3D4JMgr(processor);

		//===========================================
		//在此准备数据
		//每组数据在一个或多个二维数组中,数组中表示柱体高度(标1表示组号,相同组号同颜色;下标2表示同组中的不同列)
		//prepare your data here
		
		Random ra=new Random();
		double[][] ds1 = new double[][] { { 3, 4, 5, 6, 7 }, { 2, 3, 4, 9, 6 }, { 1, 2, 3, 8, 5 } };

		double[][] ds2 = new double[][] {
				{ 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(), 6 + ra.nextDouble(),
						7 + ra.nextDouble() },
				{ 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(),
						6 + ra.nextDouble() },
				{ 1 + ra.nextDouble(), 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(),
						5 + ra.nextDouble() } };

		double[][] ds3 = new double[][] {
				{ 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(), 6 + ra.nextDouble(),
						7 + ra.nextDouble() },
				{ 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(),
						6 + ra.nextDouble() },
				{ 1 + ra.nextDouble(), 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(),
						5 + ra.nextDouble() } };

		double[][] ds4 = new double[][] {
				{ 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(), 6 + ra.nextDouble(),
						7 + ra.nextDouble() },
				{ 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(),
						6 + ra.nextDouble() },
				{ 1 + ra.nextDouble(), 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(),
						5 + ra.nextDouble() } };

		double[][] ds5 = new double[][] {
				{ 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(), 6 + ra.nextDouble(),
						7 + ra.nextDouble() },
				{ 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(), 5 + ra.nextDouble(),
						6 + ra.nextDouble() },
				{ 1 + ra.nextDouble(), 2 + ra.nextDouble(), 3 + ra.nextDouble(), 4 + ra.nextDouble(),
						5 + ra.nextDouble() } };

		
		processor.addData("项目1", ds1);
		processor.addData("项目2", ds2);
		processor.addData("项目3", ds3);
		processor.addData("项目4", ds4);
		processor.addData("项目5", ds5);
		
		mgr.setTitle("Demo : 多层柱状图");

		//可进行相对线度显示比例调整,即一个逻辑长度可以对应不同的显示长度
		mgr.setScaleZ(8);
		mgr.setScaleX(1.2);
		mgr.setScaleY(2);
		
		mgr.setSeeta(0.3);//观察的初始俯仰角
		mgr.setBeita(1.2);//观察的初始方位角
		
		//自定义区标签,数量与组数对应
		mgr.setRulerLabelsX(new String[] { "A区", "B区", "C区", "D区", "E区" });
		mgr.setRulerLabelsY(new String[] { "2018", "2017", "2016" });
		
		//列方向标签
		mgr.setXName("X_区域");
		mgr.setYName("Y_年份");
		mgr.setZName("Z_指标");
		
		//坐标系平面空间位置稳定
		mgr.setCoordianteSysShowType(Matplot3D4JMgr.COORDINATE_SYS_STABLE);

		mgr.show();
	}

}

 

 

分享到:
评论

相关推荐

    DEM数据三维可视化--python实现

    用python语言实现DEM数据三维可视化,点击button选择DEM数据,则可显示三维地形界面。

    Python-KeplerMapper是一个用于高维数据和三维点云数据可视化的Python类

    综上所述,KeplerMapper是高维数据和三维点云数据可视化的重要工具,通过其强大的功能和交互式界面,极大地促进了数据科学家和研究人员对复杂数据的理解。在实际项目中,结合其他Python库,如scikit-learn、...

    Python三维可视化:Scipy基础一.pdf

    SciPy的介绍 •在Numpy库的基础上増加了众多的数学、科学以及工程计算中常用 的库函数 •例如: •线性代数 •常微分方程数值求解 •信号处理 •图像处理 •稀疏矩阵

    基于Python的matplotlib库和mpl-toolkits.mplot3d库实现三维可视化图的代码

    基于Python的matplotlib库和mpl_toolkits.mplot3d库实现三维可视化图的代码示例,每行代码都有注释: 此代码将生成一个简单的三维散点图,其中X轴,Y轴和Z轴分别表示X,Y和Z的值。 可以使用自己的数据来替换X,Y和Z...

    Python数据可视化任务教程(微课版)配套教案

    5. 三维可视化:介绍如何使用Mayavi或Plotly等库创建三维图表,用于展示三维数据的结构和关系。 6. 地图可视化:利用Geopandas和Basemap库将地理数据与可视化结合,制作地图图表。 7. 实战项目:通过实际案例,如...

    K-means三维可视化聚类算法

    K-means三维可视化聚类算法是一种在数据挖掘和机器学习领域广泛应用的无监督学习方法,主要用于将大量数据点划分为K个不同的簇或类别。它通过迭代过程来寻找最佳的簇中心,使得每个数据点与所属簇中心的距离最小。在...

    《Python数据可视化编程实战》配套文件

    《Python数据可视化编程实战》这本书是为那些希望通过Python进行数据可视化的人量身打造的实践指南。书中涵盖了Python在数据可视化领域的各种工具和技术,旨在帮助读者理解如何有效地展示数据,提升数据分析和解读的...

    基于Python的三维建模可视化系统研究.pdf

    标题“基于Python的三维建模可视化系统研究”意味着本研究致力于利用Python语言及其相关库开发一个三维建模可视化系统。系统的主要特点是使用了四边数据结构,这是一种基于三角网格的拓扑结构,其连接性紧密,适用于...

    地形可视化三维可视化

    地形可视化三维可视化是一种重要的计算机图形学技术,它利用科学计算和数据可视化方法将地理空间数据转化为直观的三维图像。在地质、环境科学、城市规划、地理信息系统(GIS)以及地下信息等多个领域中有着广泛的...

    基于python的北京房屋出租数据可视化分析与3D展示——亲测可用

    4. **3D可视化**:在3D展示中,我们需要考虑如何将多个变量映射到三维空间。例如,可以将房价、地理位置和房间大小作为三个坐标轴,构建3D散点图,以观察它们之间的关系。同时,颜色、大小或其他视觉元素可用于表示...

    二维DICOM图像的三维重建与可视化算法python源码+项目说明.zip

    二维DICOM图像的三维重建与可视化算法python源码+项目说明.zip 二维DICOM图像的三维重建与可视化算法python源码+项目说明.zip 二维DICOM图像的三维重建与可视化算法python源码+项目说明.zip 二维DICOM图像的三维重建...

    Python-使用Blender实现地理空间数据的实时3D可视化

    在Python编程环境中,Blender是一种强大的开源3D创作软件,它可以与各种数据集结合,用于创建令人惊叹的3D可视化效果,特别是在地理空间数据的实时3D呈现方面。本篇文章将深入探讨如何利用Python和Blender来实现这一...

    Python三维可视化:SV12-Scipy可视化实例.pdf

    Python三维可视化:SV12-Scipy可视化实例.pdf

    Python:Python数据分析基础教程王斌会第五章数据的可视化分析.pdf

    在Python数据分析领域,数据的可视化是一项至关重要的技能,它能够帮助我们更好地理解数据的特征、模式和潜在的关系。本教程是王斌会的《Python数据分析基础教程》中的第五章,专注于数据的可视化分析,主要涉及...

    三维可视化&三维建模&空间数据三维建模

    在IT行业中,三维可视化和三维建模是两个关键领域,特别是在空间数据分析中,它们的重要性不言而喻。本文将深入探讨这两个主题,并结合《空间数据三维建模与可视化_王占刚》和《三维数据可视化 唐泽圣著》这两本经典...

    基于Python的三维建模可视化系统的研究.pdf

    这两个图形库被用于实现三维可视化建模系统。 5. Quad-Edge数据结构:在三维建模中,Quad-Edge数据结构被用来作为原型实现了一种拓扑结构更紧凑、查询效率更高的数据结构模型。这种数据结构在实现三维建模时,能够...

    Python科学计算三维可视化+课程PPT及演示程序.rar

    本资源包含了一个关于Python科学计算三维可视化的课程,可能包括PPT讲解材料和实际的演示程序,帮助学习者深入理解这一主题。 首先,我们要提及的核心库是`matplotlib`,它是Python中最基础的绘图库,不仅支持二维...

    基于opencv绘制图片的三维空间显示图(python)

    总结起来,OpenCV、Numpy和Matplotlib的结合使用能帮助我们实现图像的三维可视化,这在机器学习、计算机视觉以及数据分析等领域都有广泛的应用。通过理解并实践这些步骤,你将能够创建自己的三维图像显示程序。

    毕业设计基于LMS511激光雷达三维点云可视化python源码+点云数据.zip

    毕业设计基于LMS511激光雷达三维点云可视化python源码+点云数据.zip毕业设计基于LMS511激光雷达三维点云可视化python源码+点云数据.zip毕业设计基于LMS511激光雷达三维点云可视化python源码+点云数据.zip毕业设计...

    用Python实现数据的可视化.zip python数据可视化

    Python数据可视化是一个重要的领域,它将复杂的数据集转化为易于理解的图形或图像,帮助人们快速洞察数据中的模式、趋势和关联。在这个过程中,Python库如Matplotlib、Seaborn、Plotly和Pandas等起到了关键作用。让...

Global site tag (gtag.js) - Google Analytics