如果没有数据,d3 断开折线图 但是孤立的点呢?

如何解决如果没有数据,d3 断开折线图 但是孤立的点呢?

我正在使用 dc 创建一个折线图,其中容量在 y 轴上,周在 x 轴上。对于周,范围是 1-52,但没有第 2-40 周的数据。我只有第 1 周和第 41-52 周的数据,但是当没有数据时,我的折线图仍在创建一条线:

enter image description here

如果没有值,我如何获得它以便折线图会中断?所以它不会是一根连接线。这是我的代码供参考

let chart = dc.lineChart("#chart");
let ndx = crossfilter(results);
            
let weekDimension = ndx.dimension(function (d) {
     return d.week = +d.week;
});
                
function reduceAdd(p,v) {
    ++p.count;
    p.total += v.capacity;
    p.average = p.total / p.count;
    return p;
}

function reduceRemove(p,v) {
    --p.count;
    p.total -= v.capacity;
    p.average = p.count ? p.total / p.count : 0;
    return p;
}

function reduceInitial() {
    return { count: 0,total: 0,average: 0 };
} 

let capacityGroup = weekDimension.group().reduce(reduceAdd,reduceRemove,reduceInitial);
            
chart.width(360)
    .height(200)
    .margins({ top: 20,right: 20,bottom: 50,left: 30 })
    .mouseZoomable(false)
    .x(d3.scale.linear().domain([1,52]))
    .renderHorizontalGridLines(true)
    .brushOn(false)
    .dimension(weekDimension)
    .valueAccessor(function (d) {
        return d.value.average;
    })
    .group(capacityGroup);

dc.renderAll('chart');

这就是 results 的样子

{month : "1",capacity: "48"}
{month : "1",capacity: "60"}
{month : "42",capacity: "67"}
{month : "42",capacity: "60"}
{month : "43",capacity: "66"}
{month : "44",capacity: "52"}
{month : "45",capacity: "63"}
{month : "46",capacity: "67"}
{month : "47",capacity: "80"}
{month : "48",capacity: "61"}
{month : "48",capacity: "66"}
{month : "49",capacity: "54"}
{month : "50",capacity: "69"}

我尝试添加 .defined(d => { return d.y != null; });.defined(d => !isNaN(d.value)); 但这没有任何作用...任何帮助将不胜感激

解决方法

正如我们在评论中所讨论的,重要的问题是 dc.js 只会绘制它接收到的数据。它不知道是否缺少数据,因此我们需要填充 null 以在线条中绘制间隙。

我链接到 a previous question,其中数据是时间戳。那里的答案使用 d3 time interval 来生成缺失的时间戳。

但是,您的数据使用整数作为键(即使它代表周),因此我们需要稍微更改函数:

function fill_ints(group,fillval,stride = 1) { // 1
    return {
      all: function() {
        var orig = group.all();
        var target = d3.range(orig[0].key,orig[orig.length-1].key,stride); // 2
        var result = [];
        for(var oi = 0,ti = 0; oi < orig.length && ti < target.length;) {
          if(orig[oi].key <= target[ti]) {
            result.push(orig[oi]);
            if(orig[oi++].key === target[ti])
              ++ti;
          } else {
            result.push({key: target[ti],value: fillval});
            ++ti;
          }
        } // 3
        if(oi<orig.length) // 4
          Array.prototype.push.apply(result,orig.slice(oi));
        if(ti<target.length) // 5
          result = [...result,...target.slice(ti).map(t => ({key: t,value: fillval}))];
        return result;
      }
    };
}
  1. 此函数需要一个组、要填充的值和一个步幅,即条目之间所需的间隙。
  2. 它读取当前数据,并使用 d3.range 生成所需的密钥。
  3. 它遍历两个数组,将任何缺失的条目添加到组数据的副本中。
  4. 如果原始组数据中有任何剩余条目,则将其附加。
  5. 如果还有剩余的目标,它会生成这些目标。

现在我们使用这个函数包装我们的原始组,创建一个 "fake group"

const filledGroup = fill_ints(capacityGroup,{average: null});

并将其传递给图表:

.group(filledGroup);

使用 LineChart.defined() 和底层 d3.line.defined 的一个弱点是需要两个点才能形成一条线。如果您有孤立的点,因为第 1 周在您的原始数据中是孤立的,那么它根本不会显示。

this demo fiddle 中,我通过添加第 2 周的数据避免了该问题。

screenshot with non-isolated disjoint points

但是孤立的点呢?

我很好奇如何解决“孤立点问题”,所以我尝试显示通常用于鼠标悬停效果的内置点:

chart.on('pretransition',chart => {
    const all = chart.group().all();
  isolated = all.reduce((p,kv,i) => {
    return (kv.value.average !== null &&
    (i==0 || all[i-1].value.average == null) &&
      ((i==all.length-1 || all[i+1].value.average == null))) ?
      {...p,[kv.key]: true} : p;      
  },{});
  chart.g().selectAll('circle.dot')
    .filter(d => isolated[d.data.key])
    .style('fill-opacity',0.75)
    .on('mousemove mouseout',null)
})

This works 但它目前依赖于禁用这些点的交互性,以免它们消失。

with isolated data as dots

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res