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的新手.
这是标准方法.
首先,<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)
| 归档时间: |
|
| 查看次数: |
3014 次 |
| 最近记录: |