他のライブラリなしとせずに、あなたが唯一のD3を使ってやりたいことにはいくつかの方法がありますが、データを変更する。そのうちの1つはを使用して、データの上位レベル(ネストされたデータに関する)に対処しています。のは、このコードでそれを見てみましょう:
まず、私はちょうどあなたのようなデータセットを嘲笑:
var data = [
{name: "male",
values: [{ x: 123,y: 234},
{ x: 432,y: 221},
{ x: 199,y: 56}]
},
{name: "female",
values: [{ x: 223,y: 111},
{ x: 67,y: 288},
{ x: 19, y: 387}]
}
];
これは、我々はつもり使用しているデータがあります。
var xScale = d3.scaleLinear().range([20, 380])
.domain([0, d3.max(data, function(d){
return d3.max(d.values, function(d){
return d.x;
})
})]);
var yScale = d3.scaleLinear().range([20, 380])
.domain([0, d3.max(data, function(d){
return d3.max(d.values, function(d){
return d.y;
})
})]);
今ほとんどが来る:私はそう、のは、データの第二のレベル(values
内部x
とy
)にアクセススケールのドメインを設定でき、つもりは(単なる例として)ここでは散布図を作りますよ重要な部分は:私たちは、データ「グループ」に、ないサークル要素へのつもりバインドしている:
var circlesGroups = svg.selectAll(".circlesGroups")
.data(data)
.enter()
.append("g")
.attr("fill", function(d){ return (d.name == "male") ? "blue" : "red"});
は、一度データの最初のレベルでは、我々は2つのオブジェクトを持って、D3は、私たちのために2つのグループを作成します。
私はまた、円の色を設定するためにグループを使用:name
は「男性」であれば、円は青で、それ以外の場合は赤です:今
.attr("fill", function(d){ return (d.name == "male") ? "blue" : "red"});
、作成されたグループで、我々は円を作成します次のようにデータを結合、各グループのデータでvalues
に従って:
ここ
var circles = circlesGroups.selectAll(".circles")
.data(function(d){ return d.values})
.enter()
.append("circle");
、function(d){ return d.values}
をvalues
アレイ内のオブジェクトに応じてサークルにデータを結合します。
あなたのサークルを配置します。これは、全体のコードで、それを見るために、「実行コードスニペット」をクリックします。
var data = [
{name: "male",
values: [{ x: 123,y: 234},
{ x: 432,y: 221},
{ x: 199,y: 56}]
},
{name: "female",
values: [{ x: 223,y: 111},
{ x: 67,y: 288},
{ x: 19, y: 387}]
}
];
var xScale = d3.scaleLinear().range([20, 380])
\t .domain([0, d3.max(data, function(d){
\t \t \t return d3.max(d.values, function(d){
\t \t \t \t return d.x;
\t \t })
\t })]);
\t \t
var yScale = d3.scaleLinear().range([20, 380])
.domain([0, d3.max(data, function(d){
\t \t \t return d3.max(d.values, function(d){
\t \t \t \t return d.y;
\t \t })
\t })]);
var xAxis = d3.axisBottom(xScale).tickSizeInner(-360);
var yAxis = d3.axisLeft(yScale).tickSizeInner(-360);
var svg = d3.select("body")
\t .append("svg")
\t .attr("width", 400)
\t .attr("height", 400);
svg.append("g")
\t .attr("class", "x axis")
\t .attr("transform", "translate(0,380)")
\t .call(xAxis);
\t
svg.append("g")
\t .attr("class", "y axis")
\t .attr("transform", "translate(20,0)")
\t .call(yAxis);
\t
var circlesGroups = svg.selectAll(".circlesGroups")
\t .data(data)
\t .enter()
\t .append("g")
\t .attr("fill", function(d){ return (d.name == "male") ? "blue" : "red"});
\t
var circles = circlesGroups.selectAll(".circles")
\t .data(function(d){ return d.values})
\t .enter()
\t .append("circle");
\t \t
circles.attr("r", 10)
\t .attr("cx", function(d){ return xScale(d.x)})
\t .attr("cy", function(d){ return yScale(d.y)});
.axis path, line{
\t stroke: gainsboro;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
おかげで、それは動作しますが、それは、データを変更することなく、ただ純粋なJSまたはD3でそれを行うことが可能です?私は自分のスキルを向上させたい:) – Shawn
@shawnもちろんできます。 Underscore.jsはオープンソースなので、状況を確認できます。理解するのは難しいことではありません。ここでコードする:http://underscorejs.org/underscore.js データを変更せずにd3で簡単に行うことはできません...方法はありますが、最適化されていません。 foreachデータを作成してから、値の上にfocus.selectAllを行い、そのようにサークルを追加します。 – rm4