【数据篇】33 # 可视化数据处理的一般方法是什么?

news/2024/11/15 5:41:37/

说明

【跟月影学可视化】学习笔记。

数据可视化的一般过程

  1. 先看有什么样的数据:分析真实数据
  2. 然后看想从数据中了解什么信息:获取想要的信息
  3. 再决定使用何种可视化方式呈现:为数据选择正确的呈现形式
  4. 最后看展示的效果怎么样,是否有意义:了解数据背后有价值的内容

实战演练:对公园中的游客进行数据可视化

这里使用上一节的例子进行实战演练:数据还是那些,里面有时间、地点和性别。

[{"x": 456,"y": 581,"time": 12,"gender": "f"
}, {"x": 293,"y": 545,"time": 12,"gender": "m"
}, {
...
}]
  • 第一步:假设我们想了解公园一天中的游客变化规律
  • 第二步:需要统计不同时间段公园内人数
  • 第三步:要呈现游客在不同时间段的变化规律,使用折线图来呈现
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>公园24小时游客人数变化图</title><style>html,body {width: 100%;height: 100%;}#container {width: 600px;height: 600px;border: 1px dashed #fa8072;}</style></head><body><script src="https://d3js.org/d3.v6.js"></script><script src="https://unpkg.com/spritejs@3/dist/spritejs.min.js"></script><div id="container"></div><script>const { Scene, Sprite, Polyline, SpriteSvg } = spritejs;(async function () {const data = await (await fetch("./data/park-people.json")).json();// 用到 d3.rollups 它可以对数据进行分组,然后汇总const dataset = d3.rollups(data,(v) => v.length,(d) => d.time).sort(([a], [b]) => a - b);// 假设公园是早晨 6 点开门,晚上 22 点关门,此时游客数为0dataset.unshift([6, 0]);dataset.push([22, 0]);console.log(dataset);const scene = new Scene({container,width: 600,height: 600,displayRatio: 2,});const fglayer = scene.layer("fglayer");// 把数据转换成要显示的折线上的点坐标const points = [];dataset.forEach((d, i) => {const x = 20 + 20 * d[0];const y = 300 - d[1];points.push(x, y);});// 用 SpriteJS 创建 Polyline 元素,把这个折线点坐标传给它const p = new Polyline();p.attr({points,lineWidth: 4,strokeColor: "salmon",smooth: true,});fglayer.append(p);// 创建坐标轴// 设置 domain 从 0 到 24,表示一天的 24 个小时,range 从 0 到 480,表示占据 480 像素宽度。const scale = d3.scaleLinear().domain([0, 24]).range([0, 480]);// 通过 d3.axisBottom 高阶函数,用创建的 scale 来生成一个具体的坐标轴算子 axisconst axis = d3.axisBottom(scale).tickValues(dataset.map((d) => d[0]));const axisNode = new SpriteSvg({x: 20,y: 300,flexible: true,});d3.select(axisNode.svg).attr("width", 600).attr("height", 60).append("g").call(axis);axisNode.svg.children[0].setAttribute("font-size", 20);fglayer.append(axisNode);})();</script></body>
</html>
  • 第四步:大致就得到了一天中游园人数的变化趋势,这对公园来说是有一些参考价值的。

在这里插入图片描述


http://www.ppmy.cn/news/9224.html

相关文章

mysql 存储过程批量删除重复数据

mysql 存储过程批量删除重复数据 表结构&#xff1a; LOAD DATA INFILE /usr/local/phone_imsi_12 replace INTO TABLE tbl_imsi2number_new FIELDS TERMINATED BY \t ENCLOSED BY (number,imsi); 先用SQL语句来进行去重操作&#xff1a; delete from tbl_imsi2number_new …

191:vue+openlayers 选择feature,固定按钮删除selected feature

第191个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,通过按键来删除selected的feature。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共95行)相关API参考专栏目标…

Qt编译CTK

文章目录一、CTK简介二、CTK下载三、CTK编译一、CTK简介 CTK是什么 CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit CTK 提供了什么 当前&#xff0c;CTK 工作的主要范围包括&#xff1a; DICOM&#xff1a;提供了从 PACS 和本地数据库中查询和…

redis配置文件

redis主要配置项&#xff1a; bind 0.0.0.0 #监听地址&#xff0c;可以用空格隔开后多个监听IP protected-mode yes #redis3.2 之后加入的新特性&#xff0c;在没有设置bind IP和密码的时候,redis只允许访问 127.0.0.1:6379&#xff0c;远程访问将提示警告信息并拒绝远程访问…

java基础 多线程

线程(thread)是一个程序内部的一条执行路径。 多线程的实现方案一&#xff1a;继承Thread类 public Thread(String name) 可以为当前线程指定名称 public Thread(Runnable target) 封装Runnable任务对象成为线程对象 public Thread(Runnable target &#x…

CAN 通信协议

CAN 概述 CAN 是Controller Area Network 的缩写&#xff08;以下称为CAN&#xff09;&#xff0c;它的设计目标是以最小的CPU负荷来高效处理大量的报文。1986 年德国电气商BOSCH公司开发出面向汽车的CAN 通信协议。此后&#xff0c;CAN 通过ISO11898 及ISO11519 进行了标准化…

数据在内存中的存储

专栏&#xff1a;C语言 每日一句&#xff1a;立志趁早点&#xff0c;上路轻松点&#xff0c;目光放远点&#xff0c;苦累看淡点&#xff0c;努力多一点&#xff0c;奋斗勇一点&#xff0c;胜利把名点&#xff0c;祝你折桂冠&#xff0c;成功新起点&#xff0c;幸福多一点&#…

2023年1月4日:fastadminApi接口开发项目时遇到的问题

SelectPage selectpage(官方文档&#xff1a;动态下拉(SelectPage) - FastAdmin框架文档 - FastAdmin开发文档) 常规用法 下面介绍一个基础的动态下拉列表示例&#xff0c;如下 <input id"c-name" data-rule"required" data-source"category/sel…