将每个矩形和文本分组到D3中

ihe*_*arp 2 html javascript d3.js

我正在使用d3.js创建一个条形图.在每个栏的顶部,我将显示一些文字.当用户将鼠标悬停在栏上时,它应显示文本.当它们悬停时,文本将消失.为了做到这一点,我需要将元素内部<text><rect>元素分组<g>.

<g class="gbar">
    <rect x="0" y="50" width="10" height="50" />
    <text x="15" y="40">A</text>
</g>
<g class="gbar">
    <rect x="11" y="75" width="10" height="25" />
    <text x="16" y="65">B</text>
</g>
<g class="gbar">
    <rect x="22" y="25" width="10" height="75" />
    <text x="27" y="35">C</text>
</g>
Run Code Online (Sandbox Code Playgroud)

所以这样,我可以做一个.gbar:hover rect, .gbar:hover text { ... }CSS样式来改变元素<rect><text>元素的颜色和不透明度.对于每个数据项,如何使用d3.js将元素<rect><text>元素放在元素中?<g>

谢谢

编辑:要添加更多上下文,这是我到目前为止...

var svg = d3.select('.mygraph')
            .append('svg')
            .attr('height', 100);

svg.selectAll('rect')
   .data(dataSet)
   .enter()
   .append('rect')
   .attr('x', calcX)
   .attr('y', calcY)
   .attr('width', 10)
   .attr('height', calcH);

svg.selectAll('text')
   .data(dataSet)
   .enter()
   .append('text')
   .text(function (d) {
       return d.Text;
   })
   .attr('x', textX)
   .attr('y', textY);
Run Code Online (Sandbox Code Playgroud)

该代码产生:

<svg>
    <rect x="0" y="50" width="10" height="50" />
    <rect x="11" y="75" width="10" height="25" />
    <rect x="22" y="25" width="10" height="75" />
    <text x="15" y="40">A</text>
    <text x="16" y="65">B</text>
    <text x="27" y="35">C</text>
</svg>
Run Code Online (Sandbox Code Playgroud)

我仍然是d3.js的新手.

Ger*_*ado 6

这是标准方法.

首先,<g>使用"enter"选项追加元素:

var groups = svg.selectAll(".groups")
    .data(dataset)
    .enter()
    .append("g")
    .attr("class", "gbar");
Run Code Online (Sandbox Code Playgroud)

然后,使用该选择附加矩形和文本:

groups.append('rect')
    .attr('x', calcX)
    .attr('y', calcY)
    .attr('width', 10)
    .attr('height', calcH);

groups.append('text')
    .text(function (d) {
        return d.Text;
    })
   .attr('x', textX)
   .attr('y', textY);
Run Code Online (Sandbox Code Playgroud)

这样做,你的矩形和文本将成为同一<g>元素内的每一对.

这是一个简单的演示(一个非常简单的代码,充满魔法数字).将鼠标悬停在条形图或文本上:

var data = d3.range(8).map(()=>~~(Math.random()*130));

var svg = d3.select("svg")

var groups = svg.selectAll(".groups")
	.data(data)
	.enter()
	.append("g")
    .attr("class", "gbar");
	
groups.append("rect")
	.attr("x", (d,i)=> i*40)
	.attr("width", 20)
	.attr("y", d=> 150 - d)
	.attr("height", d=> d)
	.attr("fill", "teal");
	
groups.append("text")
	.attr("x", (d,i)=> i*40)
	.attr("y", d=> 145 - d)
	.text(d=>d)
Run Code Online (Sandbox Code Playgroud)
.gbar:hover rect{
  fill:brown;
  }

.gbar:hover text{
  fill:brown;
  font-weight:700;
  }
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
Run Code Online (Sandbox Code Playgroud)

如果您检查此代码段创建的SVG,则会得到以下内容:

<g class="gbar">
    <rect x="0" width="20" y="142" height="8" fill="teal"></rect>
    <text x="0" y="137">8</text>
</g>
<g class="gbar">
    <rect x="40" width="20" y="136" height="14" fill="teal"></rect>
    <text x="40" y="131">14</text>
</g>
<g class="gbar">
    <rect x="80" width="20" y="89" height="61" fill="teal"></rect>
    <text x="80" y="84">61</text>
</g>
//etc...
Run Code Online (Sandbox Code Playgroud)