前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用D3.JS进行坐标轴绘制和图绘制

使用D3.JS进行坐标轴绘制和图绘制

作者头像
ZONGLYN
修改2019-08-15 10:42:38
6.4K0
修改2019-08-15 10:42:38
举报
文章被收录于专栏:程序萌部落程序萌部落

前面已经说过D3的功能十分强大,但是往往实际使用时只需要用到一部分内容,在这里,就只用到了 比例尺 布局 两部分,外加 核心 的请求部分(请求数据),分别用来绘制Graph的显示坐标轴和图的顶点及边;

此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片
此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片

绘制坐标轴

传统坐标轴

这里指的是 第一象限 的坐标轴,即两轴的坐标均为正数,坐标原点为(0,0)

具体可以看 这里,说的比较详细。

十字坐标轴

这里指的是 全象限 坐标轴,即两轴的坐标均从-∞开始,坐标原点为(0,0)

本质上,仍然是一般坐标轴的变形,主要原理有两点:

  • 一是利用 比例尺 对源数据做符合中心坐标轴的变换;
  • 二是创建坐标轴时利用attr("transform","translate(0,"+0.5*svgHight+")")来对坐标轴进行平移,从而达到原点在画布中心的十字坐标轴的效果。
创建比例尺
代码语言:javascript
复制
// 创建比例尺  
var xScale = d3.scale.linear()  
  .domain([-50,50]).range([0,1000]); 
//意思为生成数据是[-50,50],现在要映射到[0,1000]
var yScale = d3.scale.linear()  
  .domain([-50,50]).range([1000,0]);
添加坐标轴
代码语言:javascript
复制
var formatPrecision = d3.format('');  
// 定义X轴  
var xAxis = d3.svg.axis()  
  .scale(xScale)
  .ticks(11)  // 粗略的设置刻度线的数量,包括原点
  .orient('bottom')
  .tickFormat(formatPrecision); // 设置刻度格式
// 定义Y轴  
var yAxis = d3.svg.axis()  
  .scale(yScale)  
  .orient('left')  
  .ticks(11)  
  .tickFormat(formatPrecision);
// 创建X轴, svg中: g元素是一个分组元素  
svg.append('g')  
  .attr('class', 'axis')
  .attr("transform","translate(0,"+0.5*svgHight+")")	// 平移到水平中间
  .call(xAxis);  
// 创建Y轴  
svg.append('g')  
  .attr('class', 'axis')
  .attr("transform","translate("+0.5*svgWidth+",0)")	// 平移到竖直中间
  .call(yAxis);

绘制图(circle+line)

关于图的绘制,本质上就是圆点和线的绘制,所以这也解释了为什么输入文件中的边数据也需要包含坐标的原因,因为在d3中绘制顶点和绘制边是互不相关的。

另外需要注意的是,这里不要直接返回源数据坐标,要带入到上述定义的 比例尺 中。

话不多说直接上代码:

代码语言:javascript
复制
// 创建SVG  
var svg = d3.select('#div'+index)  
  .append('svg')  
	.attr('width', svgWidth)  
	.attr('height', svgHight);  
// 设置标题  
svg.append('text')  
  .attr('x', svgWidth / 2 - 120)  
  .attr('y', 30)  
  .attr('class', 'title')  
  .text('这是一个用d3画的简略坐标轴');  
  
// 画点,即绘制图的顶点
svg.selectAll('circle')  
	.data(data.nodes)           // json对象
  .enter()  
  .append('circle')  
	.attr('cx', function(d) {  
	  return xScale(d.cx);      // 使用比例尺返回合适的变换
	})  
	.attr('cy', function(d) {  
	  return yScale(d.cy);      // 同上
	})  
	.attr("fill","#6495ed")     // 填充颜色
	.attr("origin", function(d) {  
		return d.cx+","+d.cy;
	})
	.attr('r', function(d) {    // 圆点直径(大小)
	  if(d.value === 0||d.value/2===0)return 2; 
	  else return d.value/2;
	}); 
// 画线,即绘制图的边
svg.selectAll('line')
	.data(data.links)            // json对象
	.enter()
	.append('line')
		.attr('x1',function(d){
			return xScale(d.x1);
		})
		.attr('y1',function(d){
			return yScale(d.y1);
		})
		.attr('x2',function(d){
			return xScale(d.x2);
		})
		.attr('y2',function(d){
			return yScale(d.y2);
		})
		.attr("stroke","gray")  // 边的颜色
		.attr('stroke-width', function() {
			return 0.2;         // 边的宽度(粗细)
		});

数据读入

在数据读取方面,d3.js本身提供了一套请求操作,属于 核心 部分。具体的操作如下:

此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片
此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片

可以直接使用上述的API进行文件读取,非常方便

代码语言:javascript
复制
d3.csv("data.csv",function(error,data){  
    if(error){...}
    esle{...}
});

当然可以完美的结合JQuery进行数据操作:

代码语言:javascript
复制
$.getJSON("data.json, "", function(data) {
    // 前面各部分内容,对data进行解析即可
}

最终效果

数据格式,见文章 D3+Node快速实现图数据的可视化

此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片
此处为博客中出现的关于Spark、Hadoop、Java、IDEA、Js及html相关内容的图片
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 绘制坐标轴
    • 传统坐标轴
      • 十字坐标轴
        • 创建比例尺
        • 添加坐标轴
    • 绘制图(circle+line)
    • 数据读入
    • 最终效果
    相关产品与服务
    图数据库 KonisGraph
    图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档