0
バニラD3水平棒グラフをReact D3水平棒グラフに変換する処理中です。D3棒グラフをReact D3棒グラフに変換
- それらが互いに時に累積しない ように、私はバーコンポーネント(幅=
matrix[x1]
)を広げるにはどうすればよい:私はバーが通じ反応するが、いくつかの問題があるレンダリングができますか? - >解決済み、下記を参照 - セット1の上に2番目のバーコンポーネント(width =
matrix[x0]
)をレンダリングするにはどうすればよいですか? - >解決済み、下記を参照 - バーコンポーネントにトランジションを追加するにはどうすればよいですか?
私は作業用のバニラD3を最初に提供し、疑似作業用のリアクトD3を最初に提供します。
データ:
var matrix = [{y:0, x0:221, x1:2054},
{y:1, x0:581, x1:1891},
{y:2, x0:2485, x1:5128},
{y:3, x0:135, x1:8849},
{y:4, x0:31, x1:242}];
バニラD3
// Constants
var width = 450,
barHeight = 20,
height = 300,
delay = 500,
duration = 750;
// Type Chart
var chart = d3.select('.typeBarChart')
.attr('width', width)
.attr('height', barHeight*matrix.length);
// X-axis
var maxCrime = d3.max(matrix, (d) => {
return d.x1;
});
var x = d3.scale.linear()
.domain([0, maxCrime+50])
.range([0, width]);
var bar = chart.selectAll("g")
.data(matrix)
.enter()
.append("g")
.attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });
bar.append("rect")
.attr("fill","steelblue")
.attr("width", 0)
.attr("height", barHeight - 1)
.transition()
.delay(delay)
.duration(duration)
.ease("bounce")
.attr("width", function(d) { return x(d.x1); })
.attr("height", barHeight - 1);
bar.append("rect")
.attr("fill","#E6550D")
.attr("width", 0)
.attr("height", barHeight - 1)
.transition()
.delay(delay)
.duration(duration)
.ease("bounce")
.attr("width", function(d) { return x(d.x0); })
.attr("height", barHeight - 1);
bar.append("text")
.transition()
.delay(delay+duration)
.attr("x", function(d) {
if (d.x1 < 1000) {
return x(d.x1) + 20;
} else {
return x(d.x1) - 3;
}
})
.attr("y", barHeight/2)
.attr("dy", ".35em")
.text(function(d) { return d.x1; });
コンポーネント
const BarChart = React.createClass({
render() {
let { width, height, matrix } = this.props; // matrix data passed in from container component
let maxCrime = d3.max(matrix, (d) => {return d.x1});
let xScale = d3.scale.linear()
.domain([0, maxCrime+50])
.range([0, width]);
return (
<div>
<h3>Rendering BarChart with React</h3>
<svg
width={width}
height={height} >
<DataSeries
xScale={xScale}
matrix={matrix} />
</svg>
</div>
);
}
});
const DataSeries = React.createClass({
propTypes: {
barHeight: React.PropTypes.number,
colors: React.PropTypes.array,
matrix: React.PropTypes.array,
xScale: React.PropTypes.func
},
getDefaultProps() {
return {
barHeight: 20,
matrix: [],
colors: [
'#b2182b',
'#ef8a62',
'#fddbc7',
'#d1e5f0',
'#67a9cf',
'#2166ac'
]
};
},
render() {
let { barHeight, matrix, colors, xScale } = this.props;
let bars = matrix.map((datum, index) => {
return (
<Bar
key={index}
width={xScale(datum.x1)}
height={barHeight-1}
fill={colors[index]}
/>
);
});
return (
<g>{bars}</g>
);
}
});
const Bar = React.createClass({
propTypes: {
key: React.PropTypes.number,
width: React.PropTypes.number,
height: React.PropTypes.number,
colors: React.PropTypes.array,
matrix: React.PropTypes.array,
xScale: React.PropTypes.func
},
getDefaultProps() {
return {
matrix: [],
};
},
render() {
let { width, height, fill } = this.props;
return (
<rect
width={width}
height={height}
fill={fill}
/>
);
}
});
これで、Reactで要素を作成するので、d3遷移は使用できなくなります。トランジションに役立つ様々なリアクションコンポーネント/ライブラリがあります。また、独自のテクニックを発明することもできます。だから、自由に終わった質問です。 – meetamit