D3.js 如何旋转路径上的文本

2024-02-02

这是我的第一个 D3 项目(我不是程序员,所以一次性学习所有内容)。

我正在尝试制作一个圆形日历,我已经手绘了好几年了,这是一个巨大的痛苦。

大多数位现在都可以工作,但我不知道如何将文本旋转 90 度在这条弧线上。

一旦我转动了文本,我就需要弄清楚如何让它在圆周围均匀分布。

我的目标是让它看起来像这个手绘的例子:

这是目前的样子:

我可能会因为将文本放在一条路径上而走入死胡同,所以欢迎任何和所有建议。

Edit:我在这里创建了一个jsFiddlejsfiddle.net/LMF9h/1/ http://jsfiddle.net/LMF9h/1/

这是我到目前为止的代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
body { font: 12px Arial;}
path {
    stroke: red;
    stroke-width: 1;
    fill: none;
}
.axis path,
.axis line {
    fill: none;
    stroke: grey;
    stroke-width: 1;
    shape-rendering: crispEdges;
}
</style>

<body>
    <script type="text/javascript" src="d3/d3.v3.js"></script>

    <script type="text/javascript">

var margin = {top: 25, right: 25, bottom: 25, left: 25},
width = 950 - margin.left - margin.right,
height = 950 - margin.top - margin.bottom;

// Build Day Numbers
function pad(n) {
    return (n < 10) ? ("0" + n) : n;
}

function getDaysArray(year) {
    var numDaysInMonth, daysInWeek, daysIndex, index, i, l, daysArray;

    numDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    daysInWeek = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
    daysIndex = { 'Sun': 0, 'Mon': 1, 'Tue': 2, 'Wed': 3, 'Thu': 4, 'Fri': 5, 'Sat': 6 };

    daysArray = [];

for (m=0; m < 12; m++) {
        index = daysIndex[(new Date(year, m, 1)).toString().split(' ')[0]];
    for (i = 0, l = numDaysInMonth[m]; i < l; i++) {
        daysArray.push(pad((i + 1)) + ' ' + daysInWeek[index++]);
        if (index == 7) index = 0;
    }
}
    return daysArray;
}


var year = 2014

var days = getDaysArray(year)

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g"),
    pi = Math.PI;


var arc = d3.svg.arc()
    .innerRadius(850)
    .outerRadius(851)
    .startAngle(0)
    .endAngle(-pi*1.99999)

var path = svg.append("path")
    .attr("d", arc)
    .attr("id", "path1")
    .attr("transform", "translate(900,900)")
    .attr("fill","#f00")


// Draw lines
function daysInYear(year) {
    if(year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
        // Leap year
        return 366;
    } else {
        // Not a leap year
        return 365;
    }
}

var dt = new Date(year+"/01/01");
var day = dt.getDay();
var startrads = (2*pi / daysInYear(year)) * day;
    //---center point(width,height)---
        var cx=width
        var cy=height
        var r=850 //--radius--
        var radialLines=52 //---create 52 lines---
        var angle=2*Math.PI/radialLines //---angle between each line---
        var radialPoints=[]
        for(var k=startrads;k<radialLines;k++)
        {
                var x2=r*Math.cos(angle*k)+cx
                var y2=r*Math.sin(angle*k)+cy
                radialPoints.push([x2,y2])
        }
    //---your d3 SVG parent element---
        svg.selectAll("line")//---an empty selection---
        .data(radialPoints)
        .enter().append("svg:line")
        .attr("x1",cx)
        .attr("y1",cy)
        .attr("x2",function(p){return p[0]})
        .attr("y2",function(p){return p[1]})
        .attr("stroke","red");



// Add day labels.
var text1 = svg.append("text");


text1
    .selectAll("body")
    .data(days)
    .enter()
    .append("textPath")
    .attr("xlink:href","#path1")
    .text(function(d) { return d; });



    </script>

</body>

为了获得正确的文本,您只需要以与计算径向线末端相同的方式计算其位置和旋转。代码会是这样的

svg.selectAll("text").data(days).enter()
.append("text")
.attr("transform", function(d, i) {
    return "translate(" + (850*Math.cos(i*2*Math.PI/365)+width) +
           "," + (850*Math.sin(i*2*Math.PI/365)+height) + ")" +
           "rotate(" + (i*360/365) + ")";
})
.text(function(d) { return d; });

请注意,在 jsfiddle 中可见的圆圈一侧,文本将是颠倒的。您可以通过将 180 添加到rotate价值。修改jsfiddlehere http://jsfiddle.net/LMF9h/2/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3.js 如何旋转路径上的文本 的相关文章

  • 如何将所有后代节点和链接设置为与 2 级祖先相同的颜色?

    我有一个 d3 js 树 其后代节点接收其 2 级祖先的节点颜色 这在级别 2 到级别 3 之间有效 但在级别 4 及以上级别停止工作 相关代码 var colourScale d3 scale ordinal domain MD Prof
  • 仅从 PE 文件中提取 .text 部分

    我正在尝试从 PE 文件 dll 中提取 text 部分 即代码 Linux 或某些 python 或 ruby 库中是否有任何简单的工具可以让我轻松地完成此操作 我自己解决了 我使用 pefile python 模块提取文本部分 并使用
  • 展平使用 d3.js 嵌套创建的对象层次结构

    我正在尝试以如下方式可视化团队协作数据 图表中的不同颜色代表不同的协作工件类型 来自来源的数据如下所示 var json teamLabel Team 1 created date 2013 01 09 typeLabel Email co
  • 如何在光标下的所有元素上调用 mouseover?

    我有一个网络应用程序 每次单击时都会创建一个点 见下文 当我将鼠标悬停在一堆点上时 我希望光标下的每个点都会触发 mouseover 或 mouseenter 事件 然而 只有一个事件被触发 即堆栈 顶部 的点的事件 当鼠标移动到一堆多个点
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • 将 D3 图表另存为图像

    我在应用程序中创建了很多 D3 图表 但现在我的要求是将 D3 图表保存为任何格式 如 png gif 或 pdf 我搜索了很多 每个人都说我们可以使用画布来实现这一点 任何人都可以给出任何示例或链接吗 从概念上讲我很清楚这一点 使用can
  • D3.js 对力导向图使用什么算法?

    我有兴趣确切地知道 D3 使用什么算法来实现库中的力导向图功能 读过科布罗夫的总结 http www cs brown edu rt gdhandbook chapters force directed pdf力导向图的历史让我有点困惑 不
  • 使用 SVG 多边形元素

    我正在尝试使用 SVG 多边形和 javascript 我创建一个多边形并设置其初始点列表 如下所示 var polygon document createElementNS http www w3 org 2000 svg polygon
  • D3 v4 中的 d3.rebind

    所以我在网上找到了这段代码 它计算 d3 图中节点上的 dijkstra 最短路径算法 问题是 d3 rebind 已被删除 我还没有找到修复这段代码以使其工作的方法 有什么建议么 我也知道这段代码不是我的 所以这就是为什么我在理解如何更改
  • 鼠标悬停时在折线图上画一条线?

    我正在使用 D3 js 构建折线图 当用户将鼠标悬停在图表上时 我想在图表上绘制一条垂直线 突出显示其与图表线的交点 并显示工具提示 如以下屏幕截图所示 我已经在这条路上走了一部分了 这是我在 JSFiddle 上的代码 http jsfi
  • Google TreeMap 填充值设置为 _ABSTRACT_RENDERER_ID_1

    我正在使用谷歌树图来呈现一些数据 我的 showScale 组件有问题 当树形图渲染时 showScale 组件应显示 minColor 和 maxColor 之间的 e 渐变 此时它是完全黑色的 The fillsvg组件的属性设置如下
  • 为 d3.js 中的多个元素生成 ClipPaths

    我正在尝试创建部分填充的圆圈 就像最终的 纽约时报 政治大会可视化中的圆圈一样 http www nytimes com interactive 2012 09 06 us politics convention word counts h
  • 找不到 PySide SVG 图像格式?

    我正在使用 Eclipse 的 PyDev 插件与 Qt 集成 我安装了 PySide 但在使用 SVG 图像格式时遇到问题 我知道当我运行我的应用程序时 格式位于C Python27 Lib site packages PySide pl
  • 将字形路径转换为 ​​SVG

    我有以下字形路径
  • 如何将路径添加到剪辑路径

    当尝试向图像添加波浪效果时 我陷入困境 这两个 SVG 一个包含我尝试实现的路径 第二个的行为符合预期 但剪辑路径 形状错误 当我粘贴到所需的路径时 它不起作用 为什么以及如何才能完成这项工作 期望的路径
  • 将 SVG 中的文本修剪为给定的像素宽度

    我正在 SVG 中绘制文本标签 我有一个可用的固定宽度 比如 200px 当文字太长时 如何修剪 理想的解决方案还会在文本被剪切的地方添加省略号 但没有它我也可以生活 使用 d3 库 溢出文本的包装函数 function wrap var
  • 具有负值的条形图

    我需要创建一个可以有负值的 d3 条形图 理想情况下 零轴位置应根据数据的范围来计算 但我会选择一个假设对称正负范围的解决方案 即它始终位于图表的中间 这是我想要实现的目标的示例 好吧 假设您有一个数字数组作为数据集 其中包括一些正值和负值
  • D3js多个父节点

    我正在尝试 d3 和树布局 我认为是否可以创建具有两个根的树 我知道树只有一个根是规则 但也许有人有一些例子 这是一个Fiddle http jsfiddle net 2ob0drfk 1 显示我认为您正在寻找的内容 重要的代码就在底部附近
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • 如何为 D3 条形图分配随机颜色?

    我正在根据下面的模型制作 D3 条形图 如何使条形具有随机颜色 jsFiddle http jsfiddle net rdesai MjFgK Code svg append g attr class x axis attr transfo

随机推荐

  • 如何摆脱 jQuery 数据表插件的分页?

    我怎样才能删除分页 and showjQuery 的特点数据表 http datatables net 我只想要它的搜索和排序功能 并想摆脱其他功能 有什么办法吗 如果你不使用 jQuery UI 主题 你可以这样做 document re
  • 如何删除Android Room数据库的文件?

    我已经实现了一个房间数据库 它是从资源文件中分发的SQLite资产助手 https github com jgilfelt android sqlite asset helper第一次启动应用程序时 数据库包含游戏状态数据 因此如果玩家想要
  • 如何生成字母表数组?

    在 Ruby 中我可以做 a z to a to get a b c d z JavaScript 是否提供类似的构造 我个人认为最好的是 alphabet abcdefghijklmnopqrstuvwxyz split 简洁 有效 易读
  • 在 Java 中转换字符

    我正在学习Java 我发现表达式通常必须转换为某种类型才能正确执行 例如 在算术计算期间 字节被提升为整数 因此以下表达式将引发错误 byte b 10 int i i b b ok assigning an integer evaluat
  • 核心文本 - 从 NSRange 获取像素坐标

    我怎样才能得到一个CGRect从一个NSRange对于使用 Core Text 渲染的文本 我正在使用核心文本NSAttributedString 这是绝对的痛苦 但可以做到 您需要使用以下命令获取框架中的所有线条CTFrameGetLin
  • 我正在使用 Redux。我应该管理 Redux 存储中的受控输入状态还是在组件级别使用 setState?

    我一直在试图找出管理我的反应表单的最佳方法 我尝试使用 onChange 来触发操作并使用表单数据更新我的 redux 存储 我还尝试创建本地状态 当提交表单时 我触发并执行操作并更新 redux 存储 我应该如何管理我的受控输入状态 我喜
  • NodeJS 套接字有时可以工作

    因此 我有一个节点服务器 运行expressjs io 使用socket io 并且我正在构建一个跟踪数据库中坐标的网格地图 只是 我遇到了一个特殊的问题 因为我的套接字只监听有时 起初没有错误消息 只是偶然我让页面运行并收到此错误 Unc
  • 内核和用户模式之间共享内存。如何共享句柄?

    我正在尝试在用户进程和内核之间使用共享内存 选项一 让内核创建部分并让用户模式应用程序通过名称 Global my mem 打开内存 它仅在只读模式下工作 当我尝试使用 FILE MAP WRITE 打开部分时 它会拒绝访问 5 不确定如何
  • EF 向后兼容数据库迁移

    我试图弄清楚如何使用 EF 代码优先和迁移来实现以下部署场景 我的想法是 我想通过向后兼容的架构更改来升级数据库 例如 添加一列 并测试一切是否仍然有效 它受到绿色 蓝色部署的启发 但并不完全遵循该模式 这背后的原因是遵循这个过程 升级数据
  • 为什么 Chrome 中的页面上没有加载所有视频?

    http graysonearle com bluemen http graysonearle com bluemen 使用 webkit 浏览器单击它 加载时应该会出现 4x4 的视频网格 但 Chrome 上往往只会加载 1 3 个视频
  • 如何查询android设备硬件信息

    我如何获取 Android 设备硬件信息 如 CPU 架构 速度 霓虹灯 GPU 名称 制造商 RAM 大小 我希望有一种方法可以使用 ndk 本地执行此操作 但如果只能通过 java 代码实现 那么如何执行此操作 您需要使用Build h
  • 尝试使用嵌套属性制作表单

    我是 Rails 的初学者 所以我对嵌套属性很困惑 以下是我正在寻找的内容的概述 租车可以创造汽车 完成 客户可以预订汽车 租赁汽车在预订的同时创建客户 我正在尝试制作一份预订表格 其中包含客户和预订信息 因为租赁汽车将填写所有信息 这就是
  • 如何知道 nuget 包是否可以在 .NET Core 上运行?

    我希望网站或控制台中存在某种过滤器 不幸的是 现在这并不容易 有一个NuGet Github 上开放的问题 https github com NuGet NuGetGallery issues 3098关于向网站添加过滤器 目前 判断包是否
  • RichTextBox 和 Tab 键

    我创建了一个 richTextBox 我注意到当我按 Tab 键时它没有执行任何操作 它应该做一些空间 但它没有 我怎样才能访问它 默认情况下 按 Tab 键会将焦点移至下一个控件 将 RichTextBox 的 AcceptsTab 属性
  • MarkLogic 9 cts.parse 无法正确解析查询

    我正在使用 MarkLogic 9 开发基于 Web 的搜索应用程序 我有一个查询构建界面 允许用户将字符串输入到与数据库中文档的特定 JSON 属性相对应的文本框中 这个想法是 用户可以完全按照 cts parse 我使用服务器端 jav
  • 最外面的 CascadingValue 在页面刷新或直接链接时丢失

    我想在我的 Blazor 应用程序中共享几个组件 这些恰好是 SyncFusion 组件 一个是 SfToast 一个是 SfDialog 我认为一个简单的方法是将组件放在 MainLayout razor 上 然后使用
  • 如何“检查”函数是否确实给出随机结果?

    如何确定一个函数确实是随机的或者尽可能接近这个概念 另外 随机和伪随机之间有什么区别 最后 可以使用哪些算法 来源来生成随机数 P S 也问这个是因为 MySQL 语句使用ORDER BY RAND LIMIT 1没有给出令人信服的结果 随
  • 抽象类的可访问性不一致

    我有一个内部抽象类InternalClassBase和两个 也是内部 类InternalClass1 and InternalClass2 继承自InternalClassBase 我还有一个公共抽象类PublicClassBase和两个
  • 使用 Java 解析包含转义字符的字符串

    我想知道是否有人可以帮助我弄清楚如何解析具有以下格式的字符串 field1 field2 fieldN field1 field2 fieldN 每条记录均以 分隔记录中的每个字段均以 分隔 复杂的是各个字段可能包含转义分隔符 例如 或者
  • D3.js 如何旋转路径上的文本

    这是我的第一个 D3 项目 我不是程序员 所以一次性学习所有内容 我正在尝试制作一个圆形日历 我已经手绘了好几年了 这是一个巨大的痛苦 大多数位现在都可以工作 但我不知道如何将文本旋转 90 度在这条弧线上 一旦我转动了文本 我就需要弄清楚