d3-axis
SVGで横軸を組み立てているだけ
JSXで書き換えられそうtakker.icon
概略
Axis(selection)と関数で呼び出すと、selectionで指定されたDOMに対して軸を描画する
1. 横軸を作る
https://gyazo.com/8edf1a2a3d1e4a0e92cc86f412041021 https://takker99.github.io/rund3?js=https://scrapbox.io/api/code/takker/d3-axis/ex1.js
code:ex1.js
const { render, html } = htmPreact;
const { axisBottom, select, scaleLinear } = d3;
render(html`
描画領域の設定
code:ex1.js
svg gに描画する
縦方向に中央揃えしておく
code:ex1.js
<g transform=${translate(0, ${height / 2})} ref=${(g) => {
code:ex1.js
const padding = 20;
ここでは、値の範囲が0から100まで、描画範囲が20pxから580pxまでに設定された
svgの両端から20px離して描画するようにした
この位置設定もCSSかSVGのtransformで完結させられないかな?takker.icon
code:ex1.js
const axis = axisBottom(scale);
axis(select(g));
axis(select(g))は通常select(g).call(axis)と書く
短くaxisBottom(scale)(select(g))とも書ける
code:ex1.js
}}/>
</svg>`, document.body);
2023-02-07 11:40:37 無理だった
自分のコンテナに合わせた座標変換が不可能
code:ex1-1.js
document.body.insertAdjacentHTML("beforeend",`
<g transform="translate(${width / 2}, ${height / 2})">
<g transform="translate(0, ${height / 2})" />
</g>
</svg>
`);
const { axisBottom, select, scaleLinear } = d3;
const scale = d3.scaleLinear().domain(0, 100).range(0, 100); const axis = axisBottom(scale);
axis(select("svg g g"));
Axis.tickArguments()と同じ効果
ticks()が無いときは無視される
tickFormat()が無いときは(x) => xが使われる
Scaleのこれらの値は、Axisを実行する際にresetされてしまうので、Axis.ticks()で設定する必要がある
例:20ごとに目盛りを打つ
https://gyazo.com/99fa76f50b2e913f63337ff4815d36d2 https://suto3.github.io/rund3?code=https://scrapbox.io/api/code/takker/d3-axis/ex-ticks.js
code:ex-ticks.js
document.body.insertAdjacentHTML("beforeend",`
<g transform="translate(0, ${height / 2})" />
</svg>
`);
const { axisBottom, select, scaleLinear } = d3;
const padding = width / 30;
const axis = axisBottom(scale)
.ticks(100 / 20);
axis(select("svg g"));
references
code:axis.ts