D3线性径向时钟

卡西亚(KasiaŻukowska)

我试图创建一个径向折线图,中间显示小时。我在渲染文本时遇到问题,如下图所示(红色突出显示区域)。

在此处输入图片说明

  var xAxis = svg.selectAll('.radial').append("g");

      var xTick = xAxis
        // .selectAll("g")
        .selectAll(".radial")
        .data(x.ticks(23))
        .enter().append("g")
        .attr("text-anchor", "middle")
        .attr("transform", function(d) {
        return "rotate(" + ((x(d)) * 180 / Math.PI - 90) + ")translate(" + innerRadius + ",0)";
        });

      xTick.append("line")
        .attr("x2", -5)
        .attr("stroke", "#595D5C");

      xTick.append("text")
        .attr("transform", function(d) {
          var angle = x(d.key);
          return ((angle < Math.PI / 2) || (angle > (Math.PI * 3 / 2))) ? "rotate(90)translate(0,22)" : "rotate(-90)translate(0, -15)"; })
            .text(function(d) {
            return d;
      })
      .style("font-size", 10)
      .attr("color", "#595D5C")
      .attr("opacity", 1)

我做错了什么?

萨齐努克

const margin = {top: 20, right: 10, bottom: 20, left: 10};

const width = 650 - margin.left - margin.right,
  height = 650 - margin.top - margin.bottom;

const innerRadius = 100,
    outerRadius = Math.min(width, height) / 2 - 6;

const formatHour = d3.timeFormat("%I %p")

const fullCircle = 2 * Math.PI * 23/24;

const y = d3.scaleLinear()
    .range([innerRadius, outerRadius]);
const x = d3.scaleLinear()

    x.range([0, fullCircle]);


    const line = d3.lineRadial()
  		.angle(function(d) { return x(d.key); })
  		.radius(function(d) { return y(d.value); })
      .curve(d3.curveCardinalClosed)

    data = [];
    for (i=0;i<24;i++){data.push({key:i, value:Math.round(Math.random()*5), class:0})};

    const svg = d3.select("body").append("svg").attr("width", width).attr("height", height);
    const gSelect = svg.selectAll('.radial').data(data);

    gSelect.exit()
    .classed('radial', false)
    .attr('opacity', 0.8)
    .transition()
    .attr('opacity', 0)
    .remove();

    // current.interrupt();

    var gEnter = gSelect.enter().append("g")
    // const g = svg
    // .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
    .classed('radial', true);

    const exit = gSelect.exit().classed('radial', false);
    exit
    .attr('opacity', 0.8)
    .transition()
    .attr('opacity', 0)
    .remove();

    const mean = [];

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

    // var linePlot = gSelect.append("path")
    var linePlot = d3.selectAll('.radial').append("path")
      .datum(data)
      .attr("fill", "url(#gradientRainbow)")
      .attr("stroke", "#213946")
      .attr("stroke-width", 1)
      .attr('z-index', 200)
      .attr("d", line);

    var numColors = 10;
    var colorScale = d3.scaleLinear()
      .domain([0,(numColors-1)/2,numColors-1])
      .range(["#F5D801", "#74D877", "#2A4858"])
      .interpolate(d3.interpolateHcl);

    var gradient = d3.selectAll('.radial').append("defs").append("radialGradient")
      .attr("id", "gradientRainbow")
      .attr("gradientUnits", "userSpaceOnUse")
      .attr("cx", "0%")
      .attr("cy", "0%")
      .attr("r", "45%")
      .selectAll("stop")
      .data(d3.range(numColors))
      .enter().append("stop")
      .attr("offset", function(d,i) { return (i/(numColors-1)*50 + 40) + "%"; })
      .attr("stop-color", function(d) { return colorScale(d); });

    var yAxis = d3.selectAll('.radial').append("g")
    .attr("text-anchor", "middle");

    var yTick = yAxis
    .selectAll(".radial")
    // .selectAll("g")
    .data(y.ticks(5))
    .enter().append("g");

    yTick.append("circle")
      .attr("fill", "none")
      .attr("stroke", "#D8D8D8")
      .attr("opacity", 0.5)
      .attr("r", function(d) {return y(d)});

    //add avg
    yAxis.append("circle")
      .attr("fill", "none")
      .attr("stroke", "#2A41E5")
      .attr("stroke-width", 3)
      .attr("r", function() { return y(mean) });

    yAxis.append("circle")
      .attr("fill", "white")
      .attr("stroke", "black")
      .attr("opacity", 1)
      .attr("r", function() { return y(y.domain()[0])});

    yTick.append("text")
      .attr("y", function(d) { return -y(d); })
      .attr("dy", "0.35em")
      .text(function(d, i) {
        if (d === 0) {
        return ""
      }
      else {
        return d
      }
    });


      var xAxis = svg.selectAll('.radial').append("g");

      var xTick = xAxis
        // .selectAll("g")
        .selectAll(".radial")
        .data(x.ticks(24))
        .enter().append("g")
        .attr("text-anchor", "middle")
        .attr("transform", function(d) {
        return "rotate(" + ((x(d)) * 180 / Math.PI - 90) + ")translate(" + innerRadius + ",0)";
        });

      xTick.append("line")
        .attr("x2", -5)
        .attr("stroke", "#595D5C");

      xTick.append("text")
        .attr("transform", function(d) {
          var angle = x(d.key);
          return ((angle < Math.PI / 2) || (angle > (Math.PI * 3 / 2))) ? "rotate(90)translate(0,22)" : "rotate(-90)translate(0, -15)"; })
            .text(function(d) {
            return d;
      })
      .style("font-size", 10)
      .attr("color", "#595D5C")
      .attr("opacity", 1)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-scale/1.0.7/d3-scale.min.js"></script>

x的范围定义为[0, fullCircle],这是一个问题-0和和都fullCircle代表轴上的同一点(0度= 360度)。

这是解决该问题的非常简单的方法:

const fullCircle = 2 * Math.PI * 23/24;

您可以尝试运行代码片段以查看其工作原理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

D3径向力布局

来自分类Dev

d3.js径向时钟,添加点而不是时钟指针

来自分类Dev

D3 - 获取径向图中的维数

来自分类Dev

如何反转d3的线性标度?

来自分类Dev

在D3饼图中添加时钟点

来自分类Dev

d3 bl.ocks极地时钟问题

来自分类Dev

如何从节点和链接列表创建d3径向树?

来自分类Dev

d3径向擦除动画剪辑一个元素

来自分类Dev

d3缩放不以径向树为中心位于鼠标位置

来自分类Dev

使用D3,可以将语义缩放应用于径向树吗?

来自分类Dev

d3径向擦除动画剪辑一个元素

来自分类Dev

仅在部分节点 D3 上使用径向力

来自分类Dev

D3序数刻度和线性刻度之间的差异

来自分类Dev

D3 for循环中的代码执行不是线性(?)

来自分类Dev

d3找不到线性特性/方法?

来自分类Dev

D3:给线性标度一个动态域

来自分类Dev

将时钟点添加到d3饼图中

来自分类Dev

D3时钟未出现在生产中

来自分类Dev

使用javascript,d3和json文件中的数据在圆弧中进行径向渐变的问题

来自分类Dev

按下按钮,将D3比例从线性更改为pow

来自分类Dev

D3多轴条形图和线性图

来自分类Dev

线性渐变不适用于带有d3生成的SVG的Webkit

来自分类Dev

按下按钮,将D3比例从线性更改为pow

来自分类Dev

页面上具有不同(线性和对数)轴的多个d3图表

来自分类Dev

D3.js径向可折叠径向树(每个分支1个分支)

来自分类Dev

d3.js饼图时钟

来自分类Dev

d3.js饼图时钟

来自分类Dev

D3.js中弧的径向渐变

来自分类Dev

d3.js 径向树状下载与 svg 不同