2
codepenを作成しました。基本的に、私の軸ラベルは正常に作成され、DOMに追加されますが、グラフ領域外に描画されているため表示されません。ここでd3.js軸ラベルが応答棒グラフに表示されない
は私のCSSです:
.promo {
fill: rgba(255,0,0,0.5);
}
.price {
fill: $brand-primary;
}
.chart {
height: 50vh;
width: 100%;
overflow: hidden;
}
.svg-container {
display: inline-block;
position: relative;
width: 100%;
padding-bottom: 100%; /* aspect ratio */
vertical-align: top;
overflow: hidden;
}
.svg-content-responsive {
display: inline-block;
position: absolute;
top: 0;
left: 0;
}
そして、私のJS:私が遭遇した
let height = $('.chart').height();
let width = $('.chart').width();
let chart = d3.select('.chart')
.append("div")
.classed("svg-container", true) //container class to make it responsive
.append("svg")
.attr('preserveAspectRatio','xMinYMax meet')
.attr('viewBox','0 0 '+width +' '+height)
.classed("svg-content-responsive", true)
.append('g');
//.attr("transform", "translate(50 0)");
let tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
let date = new Date(d[0]);
let year = date.getFullYear();
let allMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
let month = allMonths[date.getMonth()];
return `<strong>$${d[1]} Billion</strong><br>${year} - ${month}`;
});
chart.call(tip);
let x = d3.scaleTime().range([0, width]);
let y = d3.scaleLinear().rangeRound([height, 0]);
d3.json("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json", function(response) {
let data = response.data;
x.domain([new Date(data[0][0]), new Date(data[data.length-1][0])]);
y.domain([0, d3.max(data, function(d) { return d[1]; })]);
let barWidth = width/data.length;
chart.append("g")
.attr("class", "axis x")
.attr("transform", "translate(0,"+(height)+")")
.call(d3.axisBottom(x).ticks(10));
chart.append("g")
.attr("class", "axis y")
.call(d3.axisLeft(y).ticks(10));
chart.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", "0.71em")
.attr("text-anchor", "end")
.text("Gross Domestic Product, USA");
//here x is already the x axis time scale you have defined in your code
var left = x(new Date("Jun 3 1980"));
var right = x(new Date("Apr 22 2013")); //one more day
var wid = right - left;
chart.append("rect")
.attr("x", left)
.attr("width", wid)
.attr('class', 'promo')
.attr("height", height);
let bar = chart.selectAll('.bar')
.data(data)
.enter();
bar.append('rect')
.attr('class', 'price')
.attr('x', function(d, i) {
return (i*barWidth);
})
.attr('y', function(d) { return y(d[1]); })
.attr("height", function(d) { return height - y(d[1]); })
.attr("width", barWidth)
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
});
ソリューションは、特定のピクセルサイズでチャートに関連し、そしてこれらに余白を追加し、軸となるようラベルはこのスペースを占有します。実際には、このアプローチは、サイズに応じたサイズのグラフ(ビューポートの高さの100%幅と50%)では不可能です。
必要に応じてラベルを表示するにはどうすればよいですか?
あなたが軸を見たい場合は、スペースを可能にするためにマージンを必要とする(彼らは、幅と高さに相対することができあなたがそうするならば)。ビューボックスのサイズ変更を無効にし、コンテナの高さ/幅の変更に応じてすべてを更新/再描画するresizeメソッドを作成します。https://bl.ocks.org/curran/3a68b0c81991e2e94b19 –
@ RyanMorton私は、コンテナサイズの変更に合わせてサイズを変更するというアプローチについて読んでいましたが、推奨されるアプローチではありません。このアプローチを使用して、あなたのコメントを実際の例にまとめることができますか? – BrynJ
@RyanMorton私はあなたが推奨したアプローチを取ったが、正しく動作していない。すべての詳細については、[この質問](https://stackoverflow.com/questions/46486646/d3-chart-redraw-not-working-on-window-resize)を参照してください。 – BrynJ