반응형
d3 원에 텍스트 추가
서클에 텍스트를 추가하려고합니다. mbostock tutorial의 예제를 따르고 있었지만 올바른 출력을 얻을 수 없었습니다.
코드 조각은 다음과 같습니다.
var data;
var code;
d3.json("/json/trace.json", function(json) {
data = json;
console.log(data);
// get code for visualization
code = data["code"];
alert(code);
var mainSVG = d3
.select("#viz")
.append("svg")
.attr("width", 900)
.attr("height", 900);
mainSVG
.append("circle")
.style("stroke", "gray")
.style("fill", "white")
.attr("r", 100)
.attr("cx", 300)
.attr("cy", 300);
circle = mainSVG.selectAll("circle").data([code]);
});
이 작업을 수행하는 방법에 대한 제안이 있습니까?
다음은 json 파일의 데이터가있는 서클의 일부 텍스트를 보여주는 예입니다 : http://bl.ocks.org/4474971 . 다음을 제공합니다.
이것의 기본 아이디어 는 페이지 머리글에서 div
로고와 회사 이름을 동일하게 유지하기 위해 html에서하는 것처럼 텍스트와 원을 동일한 " "로 캡슐화하는 것 div
입니다.
주요 코드는 다음과 같습니다.
var width = 960,
height = 500;
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
d3.json("data.json", function(json) {
/* Define the data for the circles */
var elem = svg.selectAll("g")
.data(json.nodes)
/*Create and place the "blocks" containing the circle and the text */
var elemEnter = elem.enter()
.append("g")
.attr("transform", function(d){return "translate("+d.x+",80)"})
/*Create the circle for each block */
var circle = elemEnter.append("circle")
.attr("r", function(d){return d.r} )
.attr("stroke","black")
.attr("fill", "white")
/* Create the text for each block */
elemEnter.append("text")
.attr("dx", function(d){return -20})
.text(function(d){return d.label})
})
json 파일은 다음과 같습니다.
{"nodes":[
{"x":80, "r":40, "label":"Node 1"},
{"x":200, "r":60, "label":"Node 2"},
{"x":380, "r":80, "label":"Node 3"}
]}
결과 HTML 코드는 원하는 캡슐화를 보여줍니다.
<svg width="960" height="500">
<g transform="translate(80,80)">
<circle r="40" stroke="black" fill="white"></circle>
<text dx="-20">Node 1</text>
</g>
<g transform="translate(200,80)">
<circle r="60" stroke="black" fill="white"></circle>
<text dx="-20">Node 2</text>
</g>
<g transform="translate(380,80)">
<circle r="80" stroke="black" fill="white"></circle>
<text dx="-20">Node 3</text>
</g>
</svg>
위의 예를 실제 요구 사항에 맞게 확장했습니다. 여기서 원은 단색 배경색으로 채워진 다음 스트라이프 패턴으로 & 해당 텍스트 노드가 원의 중앙에 배치 된 후.
var width = 960,
height = 500,
json = {
"nodes": [{
"x": 100,
"r": 20,
"label": "Node 1",
"color": "red"
}, {
"x": 200,
"r": 25,
"label": "Node 2",
"color": "blue"
}, {
"x": 300,
"r": 30,
"label": "Node 3",
"color": "green"
}]
};
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
svg.append("defs")
.append("pattern")
.attr({
"id": "stripes",
"width": "8",
"height": "8",
"fill": "red",
"patternUnits": "userSpaceOnUse",
"patternTransform": "rotate(60)"
})
.append("rect")
.attr({
"width": "4",
"height": "8",
"transform": "translate(0,0)",
"fill": "grey"
});
function plotChart(json) {
/* Define the data for the circles */
var elem = svg.selectAll("g myCircleText")
.data(json.nodes)
/*Create and place the "blocks" containing the circle and the text */
var elemEnter = elem.enter()
.append("g")
.attr("class", "node-group")
.attr("transform", function(d) {
return "translate(" + d.x + ",80)"
})
/*Create the circle for each block */
var circleInner = elemEnter.append("circle")
.attr("r", function(d) {
return d.r
})
.attr("stroke", function(d) {
return d.color;
})
.attr("fill", function(d) {
return d.color;
});
var circleOuter = elemEnter.append("circle")
.attr("r", function(d) {
return d.r
})
.attr("stroke", function(d) {
return d.color;
})
.attr("fill", "url(#stripes)");
/* Create the text for each block */
elemEnter.append("text")
.text(function(d) {
return d.label
})
.attr({
"text-anchor": "middle",
"font-size": function(d) {
return d.r / ((d.r * 10) / 100);
},
"dy": function(d) {
return d.r / ((d.r * 25) / 100);
}
});
};
plotChart(json);
.node-group {
fill: #ffffff;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
산출:
다음은 또한 링크입니다 codepen
.
고마워, Manish Kumar
더 쉽게 생각할 수있는 방법은 다음과 같습니다. 일반적인 생각은 텍스트 요소를 원 요소에 추가 한 다음 원의 지점에 텍스트를 배치 할 때까지 "dx"및 "dy"속성을 사용하여 재생하는 것입니다. 처럼. 내 예에서는 텍스트가 가운데 왼쪽으로 시작되도록하고 싶었 기 때문에 dx에 음수를 사용했습니다.
const nodes = [ {id: ABC, group: 1, level: 1}, {id:XYZ, group: 2, level: 1}, ]
const nodeElems = svg.append('g')
.selectAll('circle')
.data(nodes)
.enter().append('circle')
.attr('r',radius)
.attr('fill', getNodeColor)
const textElems = svg.append('g')
.selectAll('text')
.data(nodes)
.enter().append('text')
.text(node => node.label)
.attr('font-size',8)//font size
.attr('dx', -10)//positions text towards the left of the center of the circle
.attr('dy',4)
참조 URL : https://stackoverflow.com/questions/13615381/d3-add-text-to-circle
반응형
'Programing' 카테고리의 다른 글
: = vs = 만들기 매크로 (0) | 2020.12.31 |
---|---|
서버에서 보낸 이벤트와 폴링 (0) | 2020.12.31 |
카산드라 : 텍스트 대 varchar (0) | 2020.12.31 |
한 커밋이 다른 커밋의 조상인지 (또는 그 반대의 경우) 어떻게 알 수 있습니까? (0) | 2020.12.31 |
왜 Task.ConfigureAwait (continueOnCapturedContext : false); (0) | 2020.12.31 |