Skip to content

Commit eb09fb7

Browse files
authored
ignore non-finite values when inferring domain (#644)
1 parent 390aabe commit eb09fb7

File tree

5 files changed

+67
-5
lines changed

5 files changed

+67
-5
lines changed

src/defined.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ export function filter(index, ...channels) {
2323
return index;
2424
}
2525

26+
export function finite(x) {
27+
return isFinite(x) ? x : NaN;
28+
}
29+
2630
export function positive(x) {
27-
return x > 0 ? x : NaN;
31+
return x > 0 && isFinite(x) ? x : NaN;
2832
}
2933

3034
export function negative(x) {
31-
return x < 0 ? x : NaN;
35+
return x < 0 && isFinite(x) ? x : NaN;
3236
}
3337

3438
export function firstof(...values) {

src/scales/quantitative.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
} from "d3";
2424
import {ordinalRange, quantitativeScheme} from "./schemes.js";
2525
import {registry, radius, opacity, color} from "./index.js";
26-
import {positive, negative} from "../defined.js";
26+
import {positive, negative, finite} from "../defined.js";
2727
import {constant} from "../mark.js";
2828
import {order} from "../scales.js";
2929

@@ -159,15 +159,15 @@ export function ScaleIdentity() {
159159
return {type: "identity", scale: scaleIdentity()};
160160
}
161161

162-
export function inferDomain(channels, f) {
162+
export function inferDomain(channels, f = finite) {
163163
return channels.length ? [
164164
min(channels, ({value}) => value === undefined ? value : min(value, f)),
165165
max(channels, ({value}) => value === undefined ? value : max(value, f))
166166
] : [0, 1];
167167
}
168168

169169
function inferZeroDomain(channels) {
170-
return [0, channels.length ? max(channels, ({value}) => value === undefined ? value : max(value)) : 1];
170+
return [0, channels.length ? max(channels, ({value}) => value === undefined ? value : max(value, finite)) : 1];
171171
}
172172

173173
// We don’t want the upper bound of the radial domain to be zero, as this would

test/output/infinityLog.svg

Lines changed: 52 additions & 0 deletions
Loading

test/plots/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export {default as identityScale} from "./identity-scale.js";
5353
export {default as industryUnemployment} from "./industry-unemployment.js";
5454
export {default as industryUnemploymentShare} from "./industry-unemployment-share.js";
5555
export {default as industryUnemploymentStream} from "./industry-unemployment-stream.js";
56+
export {default as infinityLog} from "./infinity-log.js";
5657
export {default as learningPoverty} from "./learning-poverty.js";
5758
export {default as letterFrequencyBar} from "./letter-frequency-bar.js";
5859
export {default as letterFrequencyCloud} from "./letter-frequency-cloud.js";

test/plots/infinity-log.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as Plot from "@observablehq/plot";
2+
3+
export default function() {
4+
return Plot.dotX([NaN, 0.2, 0, 1, 2, 1 / 0]).plot({x: {type: "log", tickFormat: "f"}});
5+
}

0 commit comments

Comments
 (0)