D3.js 中的线分割

2023-12-02

我在 D3 中创建了一条连接各个数据点的线,作为音乐可视化项目的一部分:

d3.svg.line() generator with step-after interpolation

但是,我需要对不同的线段进行不同的着色。我通过创建多行而不是使用 line() 生成器(即每段一行)来做到这一点,但是我丢失了我的最想要的这样插值:

line per segment; without interpolation

注意:描边颜色不仅在开始处不同,而且在线条的其他部分也不同。

所以,我想问,是否有一种方法可以结合这两种功能(不同的颜色描边和一步后插值)。这是我的代码的主要部分(d3.svg.line() 示例),作为提示:

<script>
var margin = {top: 20, right: 20, bottom: 30, left: 50},
    width = 1200 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.linear()
    .range([0, width]);

var y = d3.scale.linear()
    .range([height, 100]);

var tickValuesArray = [0];
for (var i = 1; i < 27; i++) {
  var newTick = i*16+1;
  tickValuesArray.push(newTick);
}    

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .tickValues(tickValuesArray)
    .tickFormat(function(d,i) {return i+1 })
    .innerTickSize(-height)
    .tickPadding(10);

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .ticks(22)
    .tickFormat(function(d) {
      if (d == 0) {return "A"}
      else if (d == 1) {return "B-"}
      else if (d == 2) {return "B"}
      else if (d == 3) {return "c"}
      else if (d == 4) {return "c#"}
      else if (d == 5) {return "d"}
      else if (d == 6) {return "d#"}
      else if (d == 7) {return "e"}
      else if (d == 8) {return "f"}
      else if (d == 9) {return "f#"}
      else if (d == 10) {return "g"}
      else if (d == 11) {return "g#"}
      else if (d == 12) {return "a"}
      else if (d == 13) {return "b-"}
      else if (d == 14) {return "b"}
      else if (d == 15) {return "cc"}
      else if (d == 16) {return "cc#"}
      else if (d == 17) {return "dd"}
      else if (d == 18) {return "dd#"}
      else if (d == 19) {return "ee"}
      else if (d == 20) {return "ff"}
      else if (d == 21) {return "ff#"}
      else {return "gg"}; 
    })
    .innerTickSize(-width)
    .tickPadding(10);

var line = d3.svg.line()
    .interpolate("step-after")
    .defined(function(d) { return !isNaN(d.pitch); })
    .x(function(d) {
      return x(d.times);
    })
    .y(function(d) {
      return y(d.pitch);
    });

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


d3.tsv("linearAcomplete.tsv", type, function(error, data) {
  if (error) throw error;

  x.domain(d3.extent(data, function(d) { return d.times; }));
  y.domain(d3.extent(data, function(d) { return d.pitch; }));

  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);

  svg.append("g")
      .attr("class", "y axis")
      .call(yAxis)
    .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", ".71em")
      .style("text-anchor", "end")
      .text("Pitch");

  svg.append("path")
      .datum(data) 
      .attr("class", "line")
      .attr("d", line)
      .attr("stroke", "green"); // can I be more "flexible" here?

});

function type(d) {
  d.times = +d.times;
  d.pitch = +d.pitch;
  d.duration = +d.duration;
  return d;
}
</script>

感谢您提供的任何建议! 干杯——伊利亚斯


您可以使用线性渐变来完成此操作,但这需要您以百分比形式计算颜色的开始/停止点。这是一个简单的例子:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .line {
    fill: none;
  }
  
  .axis {
    font: 10px sans-serif;
  }
  
  .axis path,
  .axis line {
    fill: none;
    stroke: #000;
    shape-rendering: crispEdges;
  }
</style>

<body>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script>
    var margin = {
        top: 20,
        right: 20,
        bottom: 30,
        left: 40
      },
      width = 960 - margin.left - margin.right,
      height = 500 - margin.top - margin.bottom;

    var x = d3.scale.linear()
      .range([0, width]);

    var y = d3.scale.linear()
      .range([height, 0]);

    var xAxis = d3.svg.axis()
      .scale(x)
      .orient("bottom");

    var yAxis = d3.svg.axis()
      .scale(y)
      .orient("left");

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

    var grad = svg.append('defs')
      .append('linearGradient')
      .attr('id', 'grad');

    grad.append('stop')
      .attr('stop-color', 'green');

    grad.append('stop')
      .attr('stop-color', 'green')
      .attr('offset', '25%');

    grad.append('stop')
      .attr('stop-color', 'red')
      .attr('offset', '25%');

    grad.append('stop')
      .attr('stop-color', 'red')
      .attr('offset', '50%');

    grad.append('stop')
      .attr('stop-color', 'green')
      .attr('offset', '50%');

    grad.append('stop')
      .attr('stop-color', 'green')
      .attr('offset', '100%');


    var data = d3.range(100).map(function(d) {
      return {
        x: d,
        y: Math.random() * 10
      };
    })

    var line = d3.svg.line()
      .interpolate("step-after")
      .x(function(d) {
        return x(d.x);
      })
      .y(function(d) {
        return y(d.y);
      });

    x.domain([0, 100]);
    y.domain([0, d3.max(data, function(d) {
      return d.y;
    }) * 1.1]);

    svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);

    svg.append("g")
      .attr("class", "y axis")
      .call(yAxis);

    svg.append("path")
      .datum(data)
      .attr("class", "line")
      .attr("d", line)
      .attr("stroke", "url(#grad)");
  </script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3.js 中的线分割 的相关文章

  • svg 圆不是用 javascript 绘制的

    我一直在尝试使用 HTML 中的 javascript 来进行 svg 操作的 hello world 我编写了下面的代码 虽然它生成了正确的 html 但我在浏览器中没有看到任何输出 也没有看到任何错误
  • d3.js:非线性图轴

    我正在尝试在轴上添加自定义比例 如下所示 这个想法是 一个刻度总是比前一个刻度大 2 倍 我的理解是 这是一个定制秤 我做了一些研究 但找不到类似的东西 所以我想我的问题实际上是两个问题 这个尺度是数学世界的 标准 吗 这是否可以使用来实现
  • 如何使用 D3 (或只是 javascript)将表单选项设置为“选择”

    有没有一种方法可以搜索选择表单元素中的所有选项 并将具有匹配值的选项指定为 已选择 var xStat G var statOptions Points PTS Goals G Assists A Penalty Minutes PIM c
  • 如何获取 svgElement 的比例?

    我正在研究 svg div style width 300 height 300 div
  • D3.js分组条形图

    I am making a bar chart using D3 js like this source statcan gc ca http www statcan gc ca pub 12 593 x 2007001 figures f
  • 2 个 SVG 路径的交集

    我需要检查两个 SVG Path 元素是否相交 检查边界框与 getBBox 太不准确了 我目前正在做的是迭代两条路径 getTotalLength 然后检查是否有两个点 getPointAtLength 是平等的 下面是一个片段 但正如您
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • SVG 在 Firefox 中渲染得很糟糕

    我正在制作带有滑动轮播的信息图表 li 我认为 尽管 FF 中 SVG 的错误已得到解决 但 SVG 在 Firefox 中显示为像素化 有人能看到这个问题的解决办法吗 URL http weaver wp weavertest com r
  • SVG 中三角形的圆角

    我正在尝试制作一个具有圆角的三角形 三角形将如下所示 左下角是唯一看起来相当容易制作的角 主要是因为这是一个 90 度的 转弯 该转弯是使用QSVG 中的命令具有以下参数 Q x y height x y height RADIUS从我正在
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • 为 iOS 应用程序加载基于 SVG 的图像资源

    我从 thenounproject 购买了一个图标作为 SVG 图像 然后我使用一个名为的 macOS 程序Gapplin http gapplin wolfrosch com 将此 SVG 导出为 PNG 图像 它显示为 100x100
  • 如何根据形状字段值将两个不同的形状添加到 D3 力向图?

    我是D3的新手 我正在使用力定向图 我想在节点的位置添加两种不同类型的形状 我的 json 如下 nodes name 00 00 00 00 00 00 00 01 group 0 shape 1 name 00 00 00 00 00
  • 如何在 React Native 上显示 SVG 文件?

    我想显示 svg 文件 我有一堆 svg 图像 但我找不到显示的方式 我尝试使用Image and Use的组成部分反应本机 svg https github com magicismight react native svg但他们不这样做
  • 在 Crossfilter 中使用过滤器

    我刚刚开始使用 crossfilter 和 d3 js 我正在尝试 API 参考中给出的一些片段 我有以下数据 var payments crossfilter date 2011 11 14T16 17 54Z quantity 2 to
  • CSS使背景图像使用字体字符

    我想使用字体字符 例如来自 font awesome 作为输入元素的背景图像
  • DC.js 中的工具提示(D3 库)

    DC js 具有强大的内置功能 可显示每个工具提示文档 https github com dc js dc js blob master web docs api latest md title titleFunction 功能 无论如何
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • 有没有办法将 SWF 转换为 SVG 格式?

    有没有办法将 FLA 或 SWF 转换为 SVG 格式 它可以是一个软件吗 或者甚至是网络转换器 我尝试了一些方法 但没有一个有效 所有这些似乎都已经过时了 不 SWF 支持的功能太多 而 SVG 格式无法创建有效的 SWF 版本 如果您只
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程

随机推荐

  • Angular 2路由到同一路由

    I have Ride组件 并在骑行结束时Ride Summary显示 右侧的摘要有一个 开始另一次骑行 按钮 该按钮会重定向到同一组件 Ride routerLink Ride 自从Ride组件已经是我所在的组件 它没有刷新并且Ride
  • 使用 C 结构成员的连续内存

    在将其标记为重复之前 请先阅读问题 所以这可能是一个潜在的非常愚蠢的问题 但它困扰着我 我从阅读以及许多其他问题中知道 由于编译器添加的填充 C 结构中的字段不能保证是连续的 例如 根据C标准 13 在结构体对象中 非位域成员和位域所在的单
  • Javascript 在重新加载或重定向之前删除 cookie

    我需要删除一个cookie并且then进行重定向 然而 在处理重定向之前 cookie 不会被删除 问题是 如果执行重定向时 cookie 仍然存在 则重定向会被拦截并发送到预期页面以外的页面 很奇怪 我知道 说来话长 是否有可能欺骗浏览器
  • 如何使用其他Facebook帐户登录?

    我关注了本教程制作一个小应用程序来登录并打招呼 用户名 问题是 我只能使用我的帐户登录 但无法使用其他帐户登录 此问题发生在一些需要登录的示例代码 例如 HelloFacebookSample 或 Scrumptious 中 Logcat
  • 如何在Python中合并2列

    假设我使用 numpy 定义了一个 2x2 矩阵 array 1 2 2 3 现在另一个 2x1 矩阵 array 3 4 如何按列连接这两个矩阵 使其变为 array 1 2 3 2 3 4 我怎样才能删除指定列 这样它就会变成 arra
  • 使用正确的网格在 R 中绘制 netcdf

    我的目标是在世界地图上绘制硝酸盐 no3 数据 使用这些数据的正确经度和纬度 有两个 netcdf 文件 1 与数据 2 与网格信息 数据摘要信息 no3 是长度为 x y sigma 的数组 no3 df 是 x y 观测值 3 个变量
  • 在 IE7 中使用 Prawn 生成 Rails PDF

    我正在使用 Prawn 和 Prawnto 在 Ruby on Rails 应用程序 Rails 版本 2 2 2 中生成 PDF 该应用程序运行良好 可以愉快地生成 PDF 并将其发送给用户以在 Firefox 中下载 问题出在IE7上
  • 使用 PHP 在 Windows 中获取文件所有者

    在 Windows 上提供文件路径并获取其所有者用户名 当然 fileowner在这里是没用的 有什么 PECL 扩展可以提供帮助吗 编辑 也可以使用的替代方案 从 DOC 文件中读取摘要数据 以检索作者 编辑2 使用找到了解决方案COM
  • 在中心找不到工件 javax.sql:jdbc-stdext:jar:2.0 (https://repo.maven.apache.org/maven2)

    我正在尝试构建为我的项目创建的 Web 服务的 REST API 我的网络服务运行没有问题 现在 我想在远程服务器上部署我的服务 并且我需要生成war file 我使用 Java Eclipse 和 Maven 作为依赖项 我试着做一个全新
  • 如何使“%bp.hap.run-until name = X86_HLT_Instr”工作?

    从命令行模拟执行二进制文件 建议使用 bp hap run until name X86 HLT Instr 这是我的完整脚本 run command file targets qsp x86 firststeps no network s
  • 在android中解析11MB的大json[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我在使用 GSON 和 J
  • wakeLock 不等待网络连接

    我使用唤醒锁作为警报来定期更新应用程序状态 三星手机上的 WiFi 需要一段时间才能连接 还有 Wifi 上的 保持唤醒 选项does not在三星手机上工作 他们也没有兴趣解决这个问题 因此 当唤醒锁确实发生时 它应该等待 wifi 连接
  • 为什么maven依赖中的版本号有时会被跳过?

    我对 Maven 的功能还很陌生 我发现在 pom xml 中放置依赖项的地方 有时只提到 groupID 和artifact id 而跳过 version 为什么是这样 例如以下依赖项来自 springsource 网站http spri
  • 在 Sympy 中部分分解表达式

    Suppose I have an expression of the form I know that I can simplify the expression like so However sympy simplify and sy
  • iBooks图书馆般的效果

    谁能告诉我如何实现 iBooks Library 翻页效果 不是翻页 也许可以通过核心动画来实现吗 这就是您搜索的内容 它的代码非常少 并且完全在 CoreAnimation 中完成 https github com devindoty i
  • cx_Freeze:导入错误:没有名为“PyQt5.Qt”的模块

    我正在尝试使用构建我的 GUI 应用程序cx Freeze The setup py如下 from cx Freeze import setup Executable import os import sys base None if sy
  • PHP Preg_match 精确匹配单词

    我已存储为 1 7 11 我需要使用 preg match 来检查 7 有没有或 11 有吗等等 我该怎么做 Use b在表达式之前和之后仅将其作为整个单词进行匹配 str1 foo bar has matches foo bar str2
  • Elasticsearch 自定义分析器,带有 ngram,连字符上没有单词分隔符

    我正在尝试索引包含连字符但不包含空格 句点或任何其他标点符号的字符串 我不想根据连字符分割单词 而是希望连字符成为索引文本的一部分 例如 我的 6 个文本字符串是 杂志播放 马杂志 在线杂志 最佳杂志 杂志之友 杂志玩游戏 我希望能够在这些
  • 体系结构arm64的未定义符号:“_OBJC_CLASS_$_PayTabCardReaderViewController”,引用自:ViewController.o中的objc-class-ref

    导入名为 pay tabs 的库时出现这个奇怪的错误 Undefined symbols for architecture arm64 OBJC CLASS PayTabCardReaderViewController referenced
  • D3.js 中的线分割

    我在 D3 中创建了一条连接各个数据点的线 作为音乐可视化项目的一部分 但是 我需要对不同的线段进行不同的着色 我通过创建多行而不是使用 line 生成器 即每段一行 来做到这一点 但是我丢失了我的最想要的这样插值 注意 描边颜色不仅在开始