仪表 D3,显示值位置

2023-12-31

我正在尝试使用一些现成的 JavaScript 来制作仪表。我快到了,但我不知道如何管理值标题。

Here is how my code works now: enter image description here

And this is how I like it to work: enter image description here

不知道如何处理问题。使用 Math.Pi、Math.cos 和 Math.sin 对我来说实在是太多了。

var name = "Value";

var value = 17;


var gaugeMaxValue = 100; 

// data to calculate 
var percentValue = value / gaugeMaxValue; 

////////////////////////

var needleClient;



(function(){

var barWidth, chart, chartInset, degToRad, repaintGauge,
    height, margin, numSections, padRad, percToDeg, percToRad, 
    percent, radius, sectionIndx, svg, totalPercent, width;



  percent = percentValue;

  numSections = 1;
  sectionPerc = 1 / numSections / 2;
  padRad = 0.025;
  chartInset = 10;

  // Orientation of gauge:
  totalPercent = .75;

  el = d3.select('.chart-gauge');

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

  width = el[0][0].offsetWidth - margin.left - margin.right;
  height = width;
  radius = Math.min(width, height) / 2;
  barWidth = 40 * width / 300;



  //Utility methods 

  percToDeg = function(perc) {
    return perc * 360;
  };

  percToRad = function(perc) {
    return degToRad(percToDeg(perc));
  };

  degToRad = function(deg) {
    return deg * Math.PI / 180;
  };

  // Create SVG element
  svg = el.append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom);

  // Add layer for the panel
  chart = svg.append('g').attr('transform', "translate(" + ((width + margin.left) / 2) + ", " + ((height + margin.top) / 2) + ")");


  chart.append('path').attr('class', "arc chart-first");
  chart.append('path').attr('class', "arc chart-second");
  chart.append('path').attr('class', "arc chart-third");
  formatValue = d3.format('1%');
  

  


  arc3 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)
  arc2 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)
  arc1 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)

  repaintGauge = function () 
  {
    perc = 45/100;
    var next_start = totalPercent;
    arcStartRad = percToRad(next_start);
    arcEndRad = arcStartRad + percToRad(perc / 2);
    next_start += perc / 2;


    arc1.startAngle(arcStartRad).endAngle(arcEndRad);

    perc = 1-perc;
    arcStartRad = percToRad(next_start);
    arcEndRad = arcStartRad + percToRad(perc / 2);
    next_start += perc / 2;

    arc2.startAngle(arcStartRad + padRad).endAngle(arcEndRad);

    chart.select(".chart-first").attr('d', arc1);
    chart.select(".chart-second").attr('d', arc2);
 


  }
/////////

    var dataset = [{metric:name, value: value}]

    var texts = svg.selectAll("text")
                .data(dataset)
                .enter();

    texts.append("text")
         .text(function(){
              return dataset[0].metric;
         })
         .attr('id', "Name")
         .attr('transform', "translate(" + ((width + margin.left) / 6) + ", " + ((height + margin.top) / 1.5) + ")")
         .attr("font-size",25)
         .style("fill", "#000000");


    texts.append("text")
         .text(function(){
            return dataset[0].value;
         })
         .attr('id', "Value")
         .attr('transform', "translate(" + ((width + margin.left) / 1.4) + ", " + ((height + margin.top) / 1.5) + ")")
         .attr("font-size",25)
         .style("fill", "#000000");




    texts.append("text")
        .text(function(){
            return 0;
        })
        .attr('id', 'scale0')
        .attr('transform', "translate(" + ((width + margin.left) / 100 ) + ", " + ((height + margin.top) / 2) + ")")
        .attr("font-size", 15)
        .style("fill", "#000000");

    texts.append("text")
        .text(function(){
            return gaugeMaxValue/2;
        })
        .attr('id', 'scale10')
        .attr('transform', "translate(" + ((width + margin.left) / 2.15 ) + ", " + ((height + margin.top) / 30) + ")")
        .attr("font-size", 15)
        .style("fill", "#000000");


    texts.append("text")
        .text(function(){
            return gaugeMaxValue;
        })
        .attr('id', 'scale20')
        .attr('transform', "translate(" + ((width + margin.left) / 1.03 ) + ", " + ((height + margin.top) / 2) + ")")
        .attr("font-size", 15)
        .style("fill", "#000000");

  var Needle = (function() {

    //Helper function that returns the `d` value for moving the needle
    var recalcPointerPos = function(perc) {
      var centerX, centerY, leftX, leftY, rightX, rightY, thetaRad, topX, topY;
      thetaRad = percToRad(perc / 2);
      centerX = 0;
      centerY = 0;
      topX = centerX - this.len * Math.cos(thetaRad);
      topY = centerY - this.len * Math.sin(thetaRad);
      leftX = centerX - this.radius * Math.cos(thetaRad - Math.PI / 2);
      leftY = centerY - this.radius * Math.sin(thetaRad - Math.PI / 2);
      rightX = centerX - this.radius * Math.cos(thetaRad + Math.PI / 2);
      rightY = centerY - this.radius * Math.sin(thetaRad + Math.PI / 2);
      return "M " + leftX + " " + leftY + " L " + topX + " " + topY + " L " + rightX + " " + rightY;
    };

    function Needle(el) {
      this.el = el;
      this.len = width / 2.5;
      this.radius = this.len / 8;
    }

    Needle.prototype.render = function() {
      this.el.append('circle').attr('class', 'needle-center').attr('cx', 0).attr('cy', 0).attr('r', this.radius);

      return this.el.append('path').attr('class', 'needle').attr('id', 'client-needle').attr('d', recalcPointerPos.call(this, 0));


    };

    Needle.prototype.moveTo = function(perc) {
      var self,
          oldValue = this.perc || 0;

      this.perc = perc;
      self = this;

      // Reset pointer position
      this.el.transition().delay(100).ease('quad').duration(200).select('.needle').tween('reset-progress', function() {
        return function(percentOfPercent) {
          var progress = (1 - percentOfPercent) * oldValue;

          repaintGauge(progress);
          return d3.select(this).attr('d', recalcPointerPos.call(self, progress));
        };
      });

      this.el.transition().delay(300).ease('bounce').duration(1500).select('.needle').tween('progress', function() {
        return function(percentOfPercent) {
          var progress = percentOfPercent * perc;

          repaintGauge(progress);
          return d3.select(this).attr('d', recalcPointerPos.call(self, progress));
        };
      });

    };


    return Needle;

  })();



  needle = new Needle(chart);
  needle.render();
  needle.moveTo(percent);   

})();
       <style type="text/css" src="gauge.css">
            .chart-gauge
            {
              width: 400px;
              margin: 100px auto  
             } 
            .chart-first
            {
                fill: #66AB8C;
            }
            .chart-second
            {
                fill: #ff533d;
            }
  

            .needle, .needle-center
            {
                fill: #000000;
            }
            .text {
                color: "#112864";
                font-size: 16px;
            }


            svg {
              font: 10px sans-serif;
            }


        </style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.0.0/d3.min.js"></script>
<div class="chart-gauge"></div>

这一切都是为了改变翻译text

例如(设置仪表的最大值):

  texts.append("text")
    .text(function() {
      return gaugeMaxValue + "%";//i added the percent(%)
    })
    .attr('id', 'scale20')
    .attr('transform', "translate(" + ((width + margin.left) / 1.08) + ", " + ((height + margin.top) / 2) + ")")//then change the x and y for the translate
    .attr("font-size", 15)
    .style("fill", "#000000");

对于所有其他文本值也是如此。

工作代码here https://plnkr.co/edit/LJlKKX1xnVwl2LoFBFoO

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

仪表 D3,显示值位置 的相关文章

  • Javascript树遍历算法

    我需要帮助以深度优先的方式遍历树结构 我无法想出一个算法来正确地做到这一点 我的输入是这样的 A B C 1 2 a b c d 输出应采用以下形式 A 1 a A 1 b A 1 c A 1 d A 2 a A 2 b A 2 c A 2
  • 从立即调用的匿名函数表达式返回 |它去哪里?

    如果我从立即调用的匿名函数表达式返回一个对象 它会去哪里 例如 这段代码中 foo 去了哪里 function var foo return foo 这有什么有用的应用吗 从自执行函数返回一个值而不将该返回值分配给结果变量只是一个无处可去的
  • 使用 WMI 查找服务的依赖关系,然后区分依赖的服务和依赖的驱动程序

    MSDN 上有一个代码示例 它使用 WMI 枚举特定服务的所有依赖项 http msdn microsoft com en us library aa393673 v vs 85 aspx http msdn microsoft com e
  • 检查用户是否连接到 Facebook,然后检查他是否喜欢某个页面

    有没有什么方法可以检查用户是否在我的外部页面上连接到 Facebook 而不让他们允许我的应用程序之一 同样的问题也适用于 检查用户是否喜欢某个页面 我检查了大约 20 个问题和 3 4 个教程 似乎所有问题都在讨论内部脚本 粉丝页面 应用
  • JavaScript 对象引用缓存

    我们的代码库中有很多对象 它们的名称空间是为了避免冲突 Example App local view MyView 在我在代码库中看到的大多数地方 我们使用完整路径来获取对对象的引用 并且这在同一函数中重复多次 Example functi
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • HTML5 服务器端事件:EventSource 与包装的 WebSocket

    HTML5 服务器发送事件 SSE API 是否只是 HTML5 WebSocket 之上的受限制的 基于事件的 API 在我看来 一个EventSource只是一个WebSocket that Cannot send data 使用tex
  • 使用 NodeJS 让 Discord 机器人发送带有消息的图片

    我有几张照片 全部在 imgur 上 带有直接图像链接 格式 https i imgur com XXXXXX jpg https i imgur com XXXXXX jpg 以及用 NodeJS 制作的 Discord 机器人 我发送这
  • ngModel.$parsers 忽略 ng-model 值末尾的空格

    我有这样的指令 directive noWhitespace parse function parse return restrict A require ngModel link function scope element attrs
  • 从未定义解构时避免错误

    可以说我有这个代码 const x y point Babel 会将其变成 var point point x point x y point y 这很好 但是如果点未定义怎么办 现在我得到一个错误 Cannot read property
  • 是否可以覆盖 javaScript 原始数据类型?

    问题是不言自明的 我知道可以扩展原始数据类型 例如string但有可能覆盖它吗 这是在采访中被问到的一个问题 不 你不能覆盖任何东西 Ecma脚本定义原始类型 http es5 github com x4 3 2 Undefined Nul
  • 将 D3 图表另存为图像

    我在应用程序中创建了很多 D3 图表 但现在我的要求是将 D3 图表保存为任何格式 如 png gif 或 pdf 我搜索了很多 每个人都说我们可以使用画布来实现这一点 任何人都可以给出任何示例或链接吗 从概念上讲我很清楚这一点 使用can
  • 具有行组的 JQuery 斑马条纹表

    我通常将斑马条纹表行设置为奇数 偶数 如下所示 效果很好 table tbody tr visible even this addClass even table tbody tr visible odd this addClass odd
  • Bing.com 如何创建放大的缩略图?

    当我使用 Bing com 搜索图像时 我发现它们的图像经过精心裁剪和排序 当您将鼠标放在图像上时 会弹出另一个窗口 其中显示放大的图像 我想在我的程序中做同样的事情 我检查了他们页面的源代码 他们正在使用 javascript 但我仍然不
  • ReactJS:从没有 onChange 事件的 props 中选择默认值?

    所以 我只是想知道我是否绝对需要在 React 中的选择组件上有一个 onChange 事件处理程序 我有一个道具传递我想要选择的选项的默认值 如果我有的话 它就没有问题
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插入睡眠

    我正在使用 System Net FtpClient 程序集将文件上传到测试 FTP 站点 当我运行下面的代码时 文件不会出现在远程位置 除非我按照下面的方式使用 Thread Sleep 我不想使用 using System using
  • 如何知道哪个列表项对用户可见?

    我通过我的应用程序录制了视频 并将其存储在存储卡中 在我获取这些视频并将其添加到列表视图后 根据屏幕尺寸 用户只能看到一个视频 如果用户上下滚动并停止 那时我想知道哪一个在用户面前 如果有人知道解决方案请帮助我 或任何其他方法 提前致谢 好
  • Apache Lucene TokenStream 合同违规

    使用 Appache Lucene TokenStream 删除停用词 导致错误 TokenStream contract violation reset close call missing reset called multiple t
  • Ceres Solver:无法禁用日志记录(google glog)

    我在一个项目中使用 ceres 求解器 当我调用ceres Solve函数后 库开始输出如下行 iterative schur complement solver cc 88 No parameter blocks left in the
  • 根据另一个 NSArray 字符串的排序对自定义对象的 NSArray 进行排序

    我有两个NSArray我想要以相同方式排序的对象 一个包含NSString对象 其他自定义Attribute对象 这是我的 关键 NSArray 的样子 The master order NSArray stringOrder NSArra
  • spring-boot 与 tomcat 和 cxf-servlet

    我正在尝试使用 spring boot 来建立嵌入式 Tomcat 我想在应用程序中使用 CXF 来提供一组 Web 服务 但我不知道如何建立 CXF servlet 我的主课看起来像这样 Configuration EnableAutoC
  • 在 Android 中使用相机活动

    如果您想使用使用本机 Android 相机的内置相机 Activity 只需执行以下操作即可 Intent camera new Intent MediaStore ACTION IMAGE CAPTURE this startActivi
  • 为什么我们仍然在 .NET 中使用数据集?

    数据集是 NET 1 0 中最重要的东西之一 即使现在使用 NET 3 5 我仍然发现自己必须使用它们 特别是当我必须调用一个返回数据集的存储过程时 我最终会得到该数据集手动转换为对象以使其更易于使用 我从来没有真正喜欢过数据集 并且发现它
  • django 将 .values_list('datetimefield') 转换为日期

    我想将带有日期时间对象的 value list 字段转换为日期对象 values list time finished flat True 给我 2016 03 22T18 52 53 486Z 我想要的是 2016 03 22 谢谢你 您
  • Autofac多次注册组件

    在上一个关于如何可视化依赖关系图的问题中 https stackoverflow com a 59247007 1955317我为现在用来可视化我的依赖关系图的代码奠定了基础 因为它是由 Autofac 解析的 运行代码 我得到一棵树 生成
  • 为什么java进程使用的内存比预期多得多

    系统信息 操作系统 archlinux JDK OpenJDK IcedTea 2 4 3 ArchLinux 版本 7 u45 2 4 3 1 x86 64 运行应用程序 https github com aemoncannon ensi
  • 是否可以将观察者添加到tableView.contentOffset?

    我需要跟踪 tableView contentOffset y 是否可以将观察者添加到 tableView contentOffset 我认为这是不可能的 因为 contentOffset 不继承 NSObject 类 还有其他解决办法吗
  • 将递归函数转换为异步 CPS 实现 (javascript)

    这是我的功能 function duplicate step through highlighted element jq target jq char cb console log element jq var contents elem
  • 如何在R中手动更改VisNetwork中节点的位置

    我的 VisNetwork 遇到问题 我在 R 中创建了一个图表 每次单击节点并将其移动到其他位置时 它都会回到之前的位置 是否有可能手动重新安排网络 我想将一些节点移动到其他位置或更改一些节点之间的边的长度 以便它更加透明 至少有两种可能
  • 我从 C 函数读取嵌套 lua 表作为参数是否正确?

    我将用C语言实现一个函数 该函数将由Lua脚本调用 这个函数应该接收一个lua表 甚至包含一个数组 作为参数 所以我应该读取表中的字段 我尝试像下面那样做 但是当我运行它时我的函数崩溃了 谁能帮我找出问题所在吗 function findI
  • Fedora 24 上的 libicu 和 stringi 导致 R 头痛

    我最近升级到 F24 现在在我的 R 会话中我无法加载一些包 sp reshape2 latex2exp knitr 等 我发现的最初问题是 F24 使用 libicu56 而这些软件包需要 libicu54 我遵循了一个建议这个线程 ht
  • 如何以编程方式更改 Chrome 中地址栏的字体大小

    我想以编程方式更改 Chrome 中地址栏的字体大小 因为它对我来说太大了 有什么办法可以做到这一点吗 通常 地址栏的字体大小由操作系统的默认字体大小决定 在这里阅读评论 https code google com p chromium i
  • 如何在 Java 中将十六进制字符串转换为字节值

    我有一个字符串数组 我想将它转换为字节数组 我使用Java程序 例如 String str aa 55 转换成 byte new byte 0xaa byte 0x55 我能做些什么 String str Your string byte
  • 通过ParentProcessID杀死进程

    我想通过其 ParentProcessID 终止正在运行的进程 我想像您在命令行中一样执行此操作 wmic process where parentprocessid 3008 terminate 但现在的问题是 在 PowerShell
  • 仪表 D3,显示值位置

    我正在尝试使用一些现成的 JavaScript 来制作仪表 我快到了 但我不知道如何管理值标题 Here is how my code works now And this is how I like it to work 不知道如何处理问