热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

以相反顺序转换标签d3径向图

如何解决《以相反顺序转换标签d3径向图》经验,为你挑选了1个好方法。

我有一个使用一些社区样本和堆栈溢出帖子创建的d3径向图表.

这里两个底部标签和数字是镜像形式(A13和A14).寻找一些片段来逆时针转换这两个数字顶部(图表旁边)然后标记,以便它将以更好的可读形式.

的jsfiddle

var data = [
{"name":"A11","value":217,"color":"#fad64b"},
{"name":"A12","value":86,"color":"#f15d5d"},
{"name":"A13","value":79,"color":"#f15d5d"},
{"name":"A14","value":82,"color":"#f15d5d"},
{"name":"A15","value":101,"color":"#fad64b"},
{"name":"A16","value":91,"color":"#fad64b"}
];

var width = 500;
var height = 300;
var barHeight = height / 2 - 15;
var formatNumber = d3.format('s');

var color = d3.scale.ordinal()
    .range(['#F15D5D', '#FAD64B']);
var svg = d3.select('#chart').append('svg')
  .attr('width', width)
  .attr('height', height)
  .attr('class', 'radial')
  .append('g')
  .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');

var extent = [0, d3.max(data, function(d) { return d.value; })];

var lastNum = extent[1];
var percentageOne= (lastNum*25)/100;
var percentageTwo = (lastNum*50)/100;
var percentageThree = (lastNum*75)/100;
var tickValues = [percentageOne, percentageTwo, percentageThree, lastNum];

var barScale = d3.scale.linear()
    .domain(extent)
    .range([0, barHeight]);

var keys = data.map(function(d, i) {
  return d.name;
});
var numBars = keys.length;

// X scale
var x = d3.scale.linear()
.domain(extent)
.range([0, -barHeight]);

// X axis
var xAxis = d3.svg.axis()
.scale(x).orient('left')
.tickFormat(formatNumber)
.tickValues(tickValues);

// Inner circles
var circles = svg.selectAll('circle')
.data(tickValues)
.enter().append('circle')
.attr('r', function(d) {
  return barScale(d);
})
.style('fill', 'none')
.style('stroke-width', '0.5px');

// Create arcs
var arc = d3.svg.arc()
.startAngle(function(d, i) {
  var a = (i * 2 * Math.PI) / numBars;
  var b = ((i + 1) * 2 * Math.PI) / numBars;
  var d = (b - a) / 4;
  var x = a + d;
  var y = b - d;
  return x; //(i * 2 * Math.PI) / numBars; 
})
.endAngle(function(d, i) {
  var a = (i * 2 * Math.PI) / numBars;
  var b = ((i + 1) * 2 * Math.PI) / numBars;
  var d = (b - a) / 4;
  var x = a + d;
  var y = b - d;
  return y; //((i + 1) * 2 * Math.PI) / numBars; 
})
.innerRadius(0);

// Render colored arcs
var segments = svg.selectAll('path')
.data(data)
.enter().append('path')
.each(function(d) {
  d.outerRadius = 0;
})
.attr('class', 'bar')
.style('fill', function(d) {
  return d.color;
})
.attr('d', arc);

// Animate segments
segments.transition().ease('elastic').duration(1000).delay(function(d, i) {
  return (25 - i) * 10;
})
  .attrTween('d', function(d, index) {
  var i = d3.interpolate(d.outerRadius, barScale(+d.value));
  return function(t) {
    d.outerRadius = i(t);
    return arc(d, index);
  };
});

// Outer circle
svg.append('circle')
  .attr('r', barHeight)
  .classed('outer', true)
  .style('fill', 'none')
  .style('stroke-width', '.5px');

// Apply x axis
svg.append('g')
  .attr('class', 'x axis')
  .call(xAxis);

// Labels
var labelRadius = barHeight * 1.025;

var labels = svg.selectAll('foo')
.data(data)
.enter()
.append('g')
.classed('labels', true);

labels.append('def')
  .append('path')
  .attr('id', function(d, i) { return 'label-path' + i; })
  .attr('d', function(d) { 
  return 'm0 ' + -(barScale(d.value) + 4) + ' a' + (barScale(d.value) + 4) + ' ' + (barScale(d.value) + 4) + ' 0 1,1 -0.01 0'; 
});

labels.append('def')
  .append('path')
  .attr('id', function(d, i) { return 'label-pathnum' + i; })
  .attr('d', function(d){  
  return 'm0 ' + -(barScale(d.value) + 14) + ' a' + (barScale(d.value) + 14) + ' ' + (barScale(d.value) + 14) + ' 0 1,1 -0.01 0'; 
});

labels.append('text')
  .style('text-anchor', 'middle')
  .style('fill', function(d, i) {
  return d.color;
})
  .append('textPath')
  .attr('xlink:href', function(d, i) { return '#label-path' + i; })
  .attr('startOffset', function(d, i) {
  return i * 100 / numBars + 50 / numBars + '%';
})
  .text(function(d) {
  return d.name.toUpperCase();
});

labels.append('text')
  .style('text-anchor', 'middle')
  .style('fill', function(d, i) {
  return d.color;
})
  .append('textPath')
  .attr('xlink:href', function(d, i) { return '#label-pathnum' + i; })
  .attr('startOffset', function(d, i) {
  return i * 100 / numBars + 50 / numBars + '%';
})
  .text(function(d) {
  return d.value;
});

在此输入图像描述



1> fmacdee..:

您需要修改需要翻转的特定元素的路径.为此,我首先将角度存储在数据对象中:

.each(function(d,i) {
  d.outerRadius = 0;
  var angleStart = (i/numBars) * 360;
  var angleEnd = ((i+1)/numBars) * 360;
  d.angle = (angleStart + angleEnd) / 2;
})

然后我在创建文本路径时测试了角度,并反转了翻转文本案例的路径:

var len = barScale(d.value) + 4;
if(d.angle > 91 && d.angle <269) {
  len += 8; // the flipped text is on the inside of the path so we need to draw it further out
  return 'M -0.01 ' + (-len) + ' A ' + len + ' ' + len + ' 0 1,0 0 ' + (-len);
}
else {
  return 'M 0 ' + (-len) + ' A' + len + ' ' + len + ' 0 1,1 -0.01 ' + (-len); 
}

然后,您需要翻转'%around the path'以沿着反向路径放置文本:

.attr('startOffset', function(d, i) { 
  if(d.angle > 91 && d.angle <269)
    return (100 - (i * 100 / numBars + 50 / numBars)) + '%'; 
  else      
    return i * 100 / numBars + 50 / numBars + '%'; 
})

工作小提琴可以在这里找到:https://jsfiddle.net/FrancisMacDougall/mnrqokqL/

有了这个结果:

在此输入图像描述


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
nlyyan_613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有