d3.js直方图与坐标轴基础

JavaScript014

d3.js直方图与坐标轴基础,第1张

这里讲一下怎么样用d3.js,输入一个数据list,根据数据画一个带有坐标轴的简单直方图.

以下是目标效果.

引入d3.

<script src="//d3js.org/d3.v4.min.js"></script>

画矢量图需要画布,首先,创建新svg:

我的数据为一个数组: var dataset = [ 25, 6, 21 , 17 , 13 , 9, 6, 2, 20 ]

我想让我的直方图向右,纵向排列.

每一个矩形的x向长度既表示了数据的大小.

那么第一个要解决的问题就是,怎么把原始数据换算成像素,肯定不能直接画25px,6px...

这个时候就需要一个比例尺了.

d3提供的 连续比例尺 可以这么写:

定义变量linear为一个连续比例尺,定义域.domain,值域.range.

在这里,定义域 .domain([0, d3.max(dataset)])是指,我比例尺输入的数据最小为0,最大是原dataset里最大的那个数(25),所以输入比例尺的定义域为0到25,换算后的值域为0到400px,既——数据0对应0px,数据25对应400px.

有了长度比例尺,就可以画直方图了.

在这里,先定义了每一个矩形框框的高度为30px,

.data() 绑定数据dataset

.enter() 方法是专门用在这种,根据输入数据动态新建元素的情况下的,具体可以参考 官方说明 :

所以,在这里,我们既是根据输入 dataset 来新建 <rect>,

怎么根据呢?

属性设置里面:

表示的是,对于每一个新建的矩形 <rect>,x坐标为0,y坐标为序号*矩形高度+5px. (5px是矩形之间的空格)

可以理解为,在(0,0)放置一个高度为30px的矩形,再在(0,35)放一个,再在(0,70)放一个,再在(0,105)放一个...

而矩形的宽度要和我们的数据保持一致,所以width属性,输入了一个无名函数

这个函数是什么意思呢,当选择集需要使用被绑定的数据时,常需要这么使用。其包含两个参数,其中:

有了直方图的矩形,我们现在来画一个 坐标轴 .

坐标轴有4种:

分别是什么样子的呢,我们来试一试.

在API使用规范里这样写到:

意思是,在使用坐标轴的时候,必须先添加一个 <g>元素,再 .call(axis) 调用axis. 而默认坐标轴都是从原点(0,0)开始画,如果需要调整位置,在属性 transform 里设置 translate(x,y)

所以,我们测试一下在(30,30)画一个 axisTop .

我们得到结果如下:

而每个坐标轴是由哪些部分组成的呢:

除此之外,我们还可以改样式.

我们知道了每一个坐标轴有一个 <path class="domain>,我们可以试试更改样式.

而且在每一个 <g class="tick">内部,有一个 <line>和一个 <text>.

<line>,这两个元素的可用属性可以参考 line , text

最终,实现效果:

牙叔教程 简单易懂

小图, 从大图右下角裁剪出来的

大图, 分辨率1280X720

手机: Mi 11 Pro

Android版本: 11

Autojs版本: 9.0.10

autojs自带opencv版本: 4.5.1

从以上测试来看, sift对 多分辨率 的找图, 效果还可以,

但也仅仅是还可以而已,实际上他只适合一部分的找图场景,

比如, 透明按钮这种, sift就不行了,

透明按钮这种用轮廓查找, 效果还稍微好点,

从时间上来看, 大图的分辨率越低, 时间消耗越短,

所以我们找图的时候, 最好对小图可能存在的区域, 进行裁剪,

以便, 提升找图效率,

并且, 我觉得光用图片特征点, 找图还是不准,

所以我又加了一个维度: 直方图,

可以辅助判断, 找到的图片是不是我们想要的图片,

还有一个问题是, 我们既要保证, 我们能找到图片,

同时还要保证, 我们找到的图片, 确实是我们要找的图片,

你不能去找到一个类似的图片给我,

举个例子: 我爱你 .jpg, 我爱他 .jpg,

我们要找我爱你.jpg,

从特征上来说, sift有66%的概率, 找到我爱他.jpg,

并且sift认为这张图片就是我们想要的, 但其实不是,

我们要找的是我爱你.jpg,

这也是为什么我要添加 直方图 比较的原因

思路是最重要的, 其他的百度, bing, stackoverflow, 安卓文档, autojs文档, 最后才是群里问问

--- 牙叔教程

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途