d3の軸にテキストラベルを追加するにはどうすればよいですか?
たとえば、x軸とy軸を持つ単純な線グラフがあります。
私のx軸には1〜10の目盛りがあります。その下に「日」という単語を表示して、x軸が日数を数えていることを人々に知らせます。
同様に、y軸には目盛りとして1〜10の数字があり、「食べたサンドイッチ」という単語を横向きに表示します。
これを行う簡単な方法はありますか?
d3の軸にテキストラベルを追加するにはどうすればよいですか?
たとえば、x軸とy軸を持つ単純な線グラフがあります。
私のx軸には1〜10の目盛りがあります。その下に「日」という単語を表示して、x軸が日数を数えていることを人々に知らせます。
同様に、y軸には目盛りとして1〜10の数字があり、「食べたサンドイッチ」という単語を横向きに表示します。
これを行う簡単な方法はありますか?
回答:
軸ラベルはD3の軸コンポーネントに組み込まれていませんが、SVG text
要素を追加するだけで、自分でラベルを追加できます。これの良い例は、Gapminderのアニメーション化されたバブルチャート、The Wealth&Health of Nationsの再現です。x軸のラベルは次のようになります。
svg.append("text")
.attr("class", "x label")
.attr("text-anchor", "end")
.attr("x", width)
.attr("y", height - 6)
.text("income per capita, inflation-adjusted (dollars)");
そして、次のようなy軸ラベル:
svg.append("text")
.attr("class", "y label")
.attr("text-anchor", "end")
.attr("y", 6)
.attr("dy", ".75em")
.attr("transform", "rotate(-90)")
.text("life expectancy (years)");
また、スタイルシートを使用して、一緒に(.label
)または個別に(.x.label
、.y.label
)、これらのラベルを好きなようにスタイル設定することもできます。
新しいD3jsバージョン(バージョン3以降)では、d3.svg.axis()
関数を介してチャート軸を作成するとtickValues
、呼び出された2つのメソッドにアクセスできtickFormat
、関数内に組み込まれているため、ティックが必要な値とその内容を指定できます。テキストを表示する形式:
var formatAxis = d3.format(" 0");
var axis = d3.svg.axis()
.scale(xScale)
.tickFormat(formatAxis)
.ticks(3)
.tickValues([100, 200, 300]) //specify an array here for values
.orient("bottom");
私のようにy軸の中央にy軸ラベルが必要な場合:
-50
)chartHeight / 2
)コードサンプル:
var axisLabelX = -50;
var axisLabelY = chartHeight / 2;
chartArea
.append('g')
.attr('transform', 'translate(' + axisLabelX + ', ' + axisLabelY + ')')
.append('text')
.attr('text-anchor', 'middle')
.attr('transform', 'rotate(-90)')
.text('Y Axis Label')
;
これにより、上記のlubarで述べたように座標系全体が回転するのを防ぎます。
推奨されているように、d3.v4で作業する場合は、必要なすべてを提供するこのインスタンスを使用できます。
X軸のデータを「日」に置き換えたいだけかもしれませんが、文字列値を正しく解析し、連結を適用しないことを忘れないでください。
parseTimeも、日付形式でスケーリングする日のトリックを行う可能性がありますか?
d3.json("data.json", function(error, data) {
if (error) throw error;
data.forEach(function(d) {
d.year = parseTime(d.year);
d.value = +d.value;
});
x.domain(d3.extent(data, function(d) { return d.year; }));
y.domain([d3.min(data, function(d) { return d.value; }) / 1.005, d3.max(data, function(d) { return d.value; }) * 1.005]);
g.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
g.append("g")
.attr("class", "axis axis--y")
.call(d3.axisLeft(y).ticks(6).tickFormat(function(d) { return parseInt(d / 1000) + "k"; }))
.append("text")
.attr("class", "axis-title")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.attr("fill", "#5D6971")
.text("Population)");
D3は、チャートの組み立てに使用できるかなり低レベルのコンポーネントのセットを提供します。ビルディングブロック、軸コンポーネント、データ結合、選択、SVGが与えられます。それらを組み合わせてチャートを形成するのはあなたの仕事です!
従来のグラフ、つまり軸、軸ラベル、グラフタイトル、およびプロットエリアのペアが必要な場合は、d3fcをご覧ください。より高レベルのD3コンポーネントのオープンソースセットです。これには、必要なデカルトチャートコンポーネントが含まれています。
var chart = fc.chartSvgCartesian(
d3.scaleLinear(),
d3.scaleLinear()
)
.xLabel('Value')
.yLabel('Sine / Cosine')
.chartLabel('Sine and Cosine')
.yDomain(yExtent(data))
.xDomain(xExtent(data))
.plotArea(multi);
// render
d3.select('#sine')
.datum(data)
.call(chart);
ここでより完全な例を見ることができます:https : //d3fc.io/examples/simple/index.html
.attr("transform", "rotate(-90)")
により、調整システム全体が回転します。したがって、「x」と「y」を使用して配置している場合は、予想とは位置を入れ替える必要があります。