转换 Vega 数据集以计算和使用 min/max 范围

Transforming Vega dataset to calculate and use min/max range

我有一个数据集,其中有一列名为 pval。我想从该列中获取最小值和最大值并将其放入数组中。

我有以下 transform 数组,其中包含一个 formula 表达式:

transform = [{
  type: 'formula',
  expr: `[min(datum['pval']), max(datum['pval'])]`,
  as: 'pvalDomain'
}]

这里的想法是 return 一个名为 pvalDomain 的双值数组,其中包含 pval 列中值的最小值和最大值。

在绘图规范的 encoding 中,我有一个 y.scale.domain 属性 当前使用预定义数组:

encoding: {
  y: {
    field: "pval",
    type: "quantitative",
    scale: {
      domain: [7e-5, 1e-9],
      type: "log"
    },
    ...
  },
  ...
}

如果我将 y.scale.domain 的值替换为 pvalDomain:

encoding: {
  y: {
    field: "pval",
    type: "quantitative",
    scale: {
      domain: "pvalDomain",
      type: "log"
    },
    ...
  },
  ...
}

我收到以下错误:TypeError: n.every is not a function

使用通过 transform 构建的最小-最大范围数组的正确方法是什么?或者有不同的方法来计算这个范围吗?

一种方法是在编码中使用 zero: false,例如:

encoding: {
  y: {
    field: "pval",
    type: "quantitative",
    scale: {
      zero: false,
      type: "log"
    },
    ...
  },
  ...
}

这似乎无法控制填充。另一种方法是使用 d3 或类似的方法来构建域:

function paddedLogarithmicDomainForPValues(table, padding) {
  const rawPValues = d3.tsvParse(table, d3.autoType).map((d) => +d['pval']);
  return [d3.min(rawPValues) / padding, d3.max(rawPValues) * padding];
}

然后在编码中使用结果,指定一个合理的填充值来品尝:

encoding: {
  y: {
    field: "pval",
    type: "quantitative",
    scale: {
      domain: paddedLogarithmicDomainForPValues(table, 1.5),
      type: "log"
    },
    ...
  },
  ...
}