을위한 하나 X -values에 대한 열 및 여러 다른 컬럼과 파일 데이터는 CSV로 표현 된 모두 말해 Y 각 시리즈의 -values :
x,y1,y2
5,90,22
25,30,25
45,50,80
65,55,9
85,25,95
당신이 원하는 경우 코드를 완전히 일반화하려면 먼저 계열 이름 (예 : ["y1", "y2"]
)을 계산해야합니다. 세 번째 열을 CSV 파일에 추가 한 경우 ["y1", "y2", "y3"]
일 수 있습니다. d3.keys을 사용하여 이름을 계산할 수 있습니다.이 이름은 개체에서 명명 된 속성을 추출합니다. 예를 들어 d3.keys({foo: 1, bar: 2})
은 ["foo", "bar"]
을 반환합니다.
// Compute the series names ("y1", "y2", etc.) from the loaded CSV.
var seriesNames = d3.keys(data[0])
.filter(function(d) { return d !== "x"; })
.sort();
이제 일련 이름이 생겼으므로 포인트 배열 배열을 만들 수 있습니다. 외부 배열은 계열 (두 개가 있음)을 나타내고 내부 배열은 데이터 요소를 저장합니다. 포인트를 일관된 표현 (x
및 y
속성을 가진 객체)으로 동시에 변환 할 수 있으므로 일련의 코드를 재사용 할 수 있습니다.
// Map the data to an array of arrays of {x, y} tuples.
var series = seriesNames.map(function(series) {
return data.map(function(d) {
return {x: +d.x, y: +d[series]};
});
});
참고이 코드는 +
연산자를 사용하여 CSV 값을 숫자로 강제 변환합니다. CSV 파일은 형식이 지정되지 않으므로 처음에는 문자열입니다.)
데이터를 정규 형식으로 매핑 했으므로 각 계열에 대해 G 요소를 만든 다음 각 점에 대해 요소를 동그라미로 나타낼 수 있습니다. 그 결과 SVG 구조는 다음과 같이 표시됩니다
<g class="series">
<circle class="point" r="4.5" cx="1" cy="2"/>
<circle class="point" r="4.5" cx="3" cy="2"/>
…
</g>
<g class="series">
<circle class="point" r="4.5" cx="5" cy="4"/>
<circle class="point" r="4.5" cx="7" cy="6"/>
…
</g>
그리고 해당 D3 코드 :
// Add the points!
svg.selectAll(".series")
.data(series)
.enter().append("g")
.attr("class", "series")
.style("fill", function(d, i) { return z(i); })
.selectAll(".point")
.data(function(d) { return d; })
.enter().append("circle")
.attr("class", "point")
.attr("r", 4.5)
.attr("cx", function(d) { return x(d.x); })
.attr("cy", function(d) { return y(d.y); });
나는 또한 채우기 스타일을 추가하여 각 시리즈에 고유 한 색을 지정하는 코드의 비트를 추가 한을 함유 G 원소에 첨가한다. 물론 이렇게하는 데는 여러 가지 방법이 있습니다. (예를 들어, 각 시리즈의 색상에 대한 자세한 내용을 원할 수 있습니다.) x 및 y 개의 축 (축 렌더링은 제외)의 도메인을 계산하는 코드는 생략했습니다. 하지만 당신은 전체 작업 예를보고 싶다면 : 솔루션에 대한
튜토리얼 거의 ... 마이크 보스 토크 (Mike Bostock)와 같은 긴 답변을 통해 답변을 얻은 이와 비슷한 질문은 FAQ에 넣어야합니다. – paxRoman