- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 colorscaleMap 让我们假设这样的事情
d3.scale.linear()
.domain([0.01,0.02,0.03,0.04,0.05])
.range(["#5100ff", "#00f1ff", "#00ff30", "#fcff00", "#ff0000"])
现在我想使用反转功能
假设 invert("#5100ff") 并且我期望输出为 0.01,但 invert 功能不适用于非数字值。如 https://github.com/d3/d3-scale 中所述 仅当范围为数字时才支持此方法。如果范围不是数字,则返回 NaN
问题:-这与具有超过 10000 个数据点的大数据 Spectrogram 有关。 Y - 轴是频率,X 轴是时间,颜色代表振幅。我想写 Index 函数会很低效
有没有人能解决这个问题?
最佳答案
这不是一件容易的事,如果可能的话,最好通过使用绑定(bind)数据来避免这个问题。
但是,这是一个非常有趣的问题。在反转数字时,您至少会绑定(bind)到一个维度,数字将落在可插值的范围内(有一些特定的异常(exception))。对于三维色彩空间,这会变得有点困难,尤其是对于分段的域和范围。但是,即使我们抛开为比例尺无法产生的反转函数提供颜色,事情仍然很困难。
如前所述,d3-scale 不支持非数值反转,d3-interpolate 也不提供反转支持。我们也不能在连续尺度上拥有非数字域(这将提供最简单的解决方案)。如果不重写每个颜色插值器,任何解决方案都可能特定于某个插值(默认是每个 channel 上的线性插值,所以我将在下面使用它)。
如果我们能够解决上述问题,最后一个挑战是您无法拥有很高的精度:RGB channel 值四舍五入为 0 到 255 之间的 8 位数字。反转此数字会产生舍入误差。
这个舍入问题通常因许多色阶在任何给定 channel 上不使用 0 - 255 的完整范围这一事实而变得复杂。如果从红色变为橙色,变化最大的 channel 是绿色,变化为 165。这肯定会降低任何反转函数的精度。
也就是说,我们可以为具有颜色空间范围的比例制作简单的反转函数。这可能需要几个步骤:
a
,b
)。y
。a
和 b
之间反插 y
,得到 t
t
并在尺度域的最小值和最大值之间进行插值线性插值器如下所示:y = a + t * (b - a)
这样我们就可以反插值了:t = (y - a)/(b - a)
t
是一个介于 0 和 1 之间的数字,其中(当应用于插值器时)0 将在域中产生最小值,1 将在域中产生最大值。
这可能是这样的:
var scale = d3.scaleLinear()
.domain([0,100])
.range(["orange","red"])
scale.invertColor = function(x) {
// get the color into a common form
var color = d3.color(x);
// do the same for the range:
var min = d3.color(this.range()[0]);
var max = d3.color(this.range()[1]);
// find out which channel offerrs the greatest spread between min and max:
var spreads = [max.r-min.r,max.g-min.g,max.b-min.g].map(function(d) { return Math.abs(d); });
var i = spreads.indexOf(Math.max(...spreads));
var channel = d3.keys(color)[i];
// The deinterpolation function
var deinterpolate = function (value,a,b) {
if(b-a==0) return 0;
return Math.abs((value - a) / (b - a))
}
// Get t
var t = deinterpolate(color[channel],min[channel],max[channel]);
// Interpolate between domain values with t to get the inverted value:
return d3.interpolate(...this.domain())(t)
};
var test = [0,10,50,90,100];
console.log("Test values:");
console.log(test)
console.log("Scaling and then Inverting values:");
console.log(test.map(function(d) { return scale.invertColor(scale(d)); }));
console.log("Original values minus scaled and inverted values:");
console.log(test.map(function(d) { return (d - scale.invertColor(scale(d))); }));
<script src="https://d3js.org/d3.v5.min.js"></script>
以上是有限制的,你可以喂它任何颜色。它会为您插入一个值,即使该比例不能产生该值。
通过多次使用上述函数,可以很容易地为多个段修改它。我们可以检查每个段,看看是否有一个值一旦被反转后会按比例缩小到每个段的自身。通过这样做,只能反转比例尺产生的颜色:
var scale = d3.scaleLinear()
.domain([0,100,200])
.range(["orange","red","purple"])
scale.invertColor = function(x) {
var domain = this.domain();
var range = this.range();
// check each segment to see if the inverted value scales back to the original value:
for(var i = 0; i < domain.length - 1; i++) {
var d = [domain[i], domain[i+1]];
var r = [range[i], range[i+1]];
var inverted = (invert(x,d,r))
if (d3.color(this(inverted)).toString() == d3.color(x).toString()) return inverted;
}
return NaN; // if nothing matched
function invert(x,d,r) {
// get the color into a common form
var color = d3.color(x);
// do the same for the range:
var min = d3.color(r[0]);
var max = d3.color(r[1]);
// find out which channel offerrs the greatest spread between min and max:
var spreads = [max.r-min.r,max.g-min.g,max.b-min.g].map(function(d) { return Math.abs(d); });
var i = spreads.indexOf(Math.max(...spreads));
var channel = d3.keys(color)[i];
// The deinterpolation function
var deinterpolate = function (value,a,b) {
if(b-a==0) return 0;
return Math.abs((value - a) / (b - a))
}
// Get t
var t = deinterpolate(color[channel],min[channel],max[channel]);
// Interpolate between domain values with t to get the inverted value:
return d3.interpolate(...d)(t)
}
};
var test = [0,10,50,90,100,110,150,190,200];
console.log("Test values:");
console.log(test)
console.log("Scaling and then Inverting values:");
console.log(test.map(function(d) { return scale.invertColor(scale(d)); }));
console.log("Original values minus scaled and inverted values:");
console.log(test.map(function(d) { return (d - scale.invertColor(scale(d))); }));
<script src="https://d3js.org/d3.v5.min.js"></script>
关于javascript - D3 Inverting Color Scale Map 得到振幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427754/
我正在尝试在 View 中同时使用 scalegesture 监听器和 gesturelistener。如果比例为 1,则一切正常,但如果将比例设置为其他值,图像会跳到一个新位置,然后平滑缩放。 我的
我在使用 Canvas 和 canvas.scale(Scale, Scale) 时遇到图像质量问题;它们看起来完全像下面这样: android:运行时调整大小的图像质量 我相信我已经阅读了所有关于调
我有一个使用 svg 过滤器附加阴影的 svg 图形。我需要缩放阴影,但找不到可以执行此操作的过滤器。有谁知道这是否可能?
我正在构建一个逻辑回归分类器。 我从一组 500.000 条记录开始,我只想使用其中的一个样本。 你有什么建议: 1) 缩放总体然后采样2)缩放样本3) 仅缩放样本的 X_TRAIN 分割? 为什么?
我有一个功能,我用它在鼠标进入时放大图片并在鼠标离开时返回到正常大小。问题是,如果我在允许图片返回正常大小之前快速将鼠标移出然后将鼠标移入,那么图片将从鼠标输入时当前的任何大小放大(x2.7) (并且
可以在 scale-y-2 中使用 zoomtovalues 吗?我在多个 y 轴上有几个系列,我想将每个 scale-y-n 缩放到特定值,但我不知道如何... 谢谢和问候, 最佳答案 我们在最近的
我正在尝试在 Android 中创建(我认为是)一个相对简单的动画。也就是说,我想让某个 TextView 在单击按钮时缩小到 0 并返回到 1。当我单击该按钮时实际发生的是 TextView 立即缩
我有一个元素需要缩放到父元素的 100%。因为该元素包含基于像素的动画和可以缩放的图像,所以我不能使用百分比。有没有办法使用 css transform scale 来做到这一点? 最佳答案 相对 c
我在 ChartJS 中遇到一个奇怪的错误并且不知道如何修复它,由于这个错误我无法更改比例的任何内容。 我的代码(Sensor.tsx): import { useParams } from "sol
我有一些数据,我正试图通过不断增加的分母来准确和精确地处理这些数据。 请假设分子总是有小数。 我在 docs 中看到divide(BigDecimal divisor) 实际上会减小比例,这看起来很奇
喂, https://jsfiddle.net/jbwq6y87/7/ #box { width: 500px; height: 500px; transition: 0.5s; ov
几个 Tk 小部件也存在于 Ttk 版本中。通常它们具有相同的一般行为,但使用“样式”和“主题”而不是每个实例的外观属性(例如 bg 等)。这很好,因为 Ttk 小部件默认采用操作系统窗口管理器的“标
我尝试转换视频并使用 scale=-1:720 调整其大小,但出现错误“宽度不能被 2 整除”。我解决了这个问题:scale=-2:720。 之间有什么区别 scale=-1:720 和 scale=
我正在尝试重新创建此 codepen变换:我网站上特定页面的缩放转换,但它没有按预期工作 - 正如您在此代码片段中看到的那样(在整页上查看) - 图像覆盖/覆盖不足和不稳定而不是平滑。 /* Part
我有 3 个 Scale 小部件 scale1、scale2 和 scale3。我想使用 scale1 按以下方式控制 scale2 和 scale3 的值: 我不希望 scale2 和 scale3
我目前正在将我的数据分析从 R 转移到 Python。在 R 中缩放数据集时,我会使用 R.scale(),据我所知,它会执行以下操作:(x-mean(x))/sd(x) 为了替换该函数,我尝试使用
从文档中,定义为: 量化 ..a variant of linear scales with a discrete rather than continuous range. The input do
我有一个时基折线图,我正在尝试获取点击坐标处每个刻度的值。 我在 ChartJS 选项中指定的 onClick 函数: onClick: function(event, elementsAtEvent
我见过这样写的代码: ,但我也看到过这样写的代码: initial-scale=1 和 initial-scale=1.0 有区别吗? 最佳答案 没有。 specification描述视口(viewp
给定 y 轴 (s) 上的缩放和 x 轴 (t) 上的平移参数,当目的是最大化曲线叠加(而不是最小化距离)时,如何缩放和对齐两条不重合的曲线? 正如 @DWin 所指出的,这可能会被重新命名为“如何使
我是一名优秀的程序员,十分优秀!