Javascript 如何在D3中的不同行上打印工具提示的内容
下面是水平堆叠条形图的代码。当我将鼠标悬停在任意一个栏上时,它会在一行中显示元素的内容。我想添加换行符来分隔数据的每个参数。我试着寻找这种类型的问题,发现了一些带有“tspan”的东西,但这在我的代码中不起作用。请看一看Javascript 如何在D3中的不同行上打印工具提示的内容,javascript,d3.js,Javascript,D3.js,下面是水平堆叠条形图的代码。当我将鼠标悬停在任意一个栏上时,它会在一行中显示元素的内容。我想添加换行符来分隔数据的每个参数。我试着寻找这种类型的问题,发现了一些带有“tspan”的东西,但这在我的代码中不起作用。请看一看 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="lit" uri="/WEB-INF/......" %>
<!DOCTYPE html>
<meta charset="utf-8">
<head>
<link rel="stylesheet" media="all" type="text/css" href="<c:url value="/styl........."/>" />
</head>
<body>
<script src="//d3js.org/d3.v3.js"></script>
<script>
var i = 0;
var margins = {
top: 12,
left: 48,
right: 24,
bottom: 24
},
legendPanel = {
width: 180
},
width = 1500 - margins.left - margins.right - legendPanel.width,
height = 900 - margins.top - margins.bottom,
dataset = ${JSONData},
series = dataset.map(function (d) {
return d.name;
}),
dataset = dataset.map(function (d) {
return d.data.map(function (o) {
return {
name: d.name,
y: +o.count,
x: o.time
};
});
}),
stack = d3.layout.stack();
stack(dataset);
var dataset = dataset.map(function (group) {
return group.map(function (d) {
return {
name: d.name,
x: d.y,
y: d.x,
x0: d.y0
};
});
}),
svg = d3.select('body')
.append('svg')
.attr('width', width + margins.left + margins.right + legendPanel.width)
.attr('height', height + margins.top + margins.bottom)
.append('g')
.attr('transform', 'translate(' + margins.left + ',' + margins.top + ')'),
xMax = d3.max(dataset, function (group) {
return d3.max(group, function (d) {
return d.x + d.x0;
});
}),
xScale = d3.scale.linear()
.domain([0, xMax])
.range([0, width]),
months = dataset[0].map(function (d) {
return d.y;
}),
_ = console.log(months),
yScale = d3.scale.ordinal()
.domain(months)
.rangeRoundBands([0, height], .1),
xAxis = d3.svg.axis()
.scale(xScale)
.orient('bottom'),
yAxis = d3.svg.axis()
.scale(yScale)
.orient('left'),
colours = d3.scale.category10(),
groups = svg.selectAll('g')
.data(dataset)
.enter()
.append('g')
.style('fill', function (d, i) {
return colours(i);
}),
rects = groups.selectAll('rect')
.data(function (d) {
return d;
})
.enter()
.append('rect')
.attr('x', function (d) {
return xScale(d.x0);
})
.attr('y', function (d, i) {
return yScale(d.y);
})
.attr('height', function (d) {
return yScale.rangeBand();
})
.attr('width', function (d) {
return xScale(d.x);
})
.on('mouseover', function (d) {
var xPos = parseFloat(d3.select(this).attr('x')) / 2 + width/2;
var yPos = parseFloat(d3.select(this).attr('y')) + yScale.rangeBand() / 2;
d3.select('#tooltip')
.style('left', xPos + 'px')
.style('top', yPos + 'px')
.select('#value')
.text("Count: " + d.x + "Time: " + d.y + "String1"+
"\nString2");
//.text(d.x+","+d.y+","+d.name);
d3.select('#tooltip').classed('hidden', false);
})
.on('mouseout', function () {
d3.select('#tooltip').classed('hidden', true);
})
svg.append('g')
.attr('class', 'axis')
.attr('transform', 'translate(0,' + height + ')')
.call(xAxis);
svg.append('g')
.attr('class', 'axis')
.call(yAxis);
svg.append('rect')
.attr('fill', 'yellow')
.attr('width', 160)
.attr('height', 30 * dataset.length)
.attr('x', width + margins.left)
.attr('y', 0);
series.forEach(function (s, i) {
svg.append('text')
.attr('fill', 'black')
.attr('x', width + margins.left + 8)
.attr('y', i * 24 + 24)
.text(s);
svg.append('rect')
.attr('fill', colours(i))
.attr('width', 60)
.attr('height', 20)
.attr('x', width + margins.left + 90)
.attr('y', i * 24 + 6);
});
</script>
<div id="tooltip" class="hidden">
<p><span id="value">100</span>
</p>
</div>
</body>
</html>
var i=0;
var保证金={
前12名,
左:48,
右:24,
底数:24
},
传奇面板={
宽度:180
},
宽度=1500-margins.left-margins.right-legendPanel.width,
高度=900-页边距。顶部-页边距。底部,
数据集=${JSONData},
series=dataset.map(函数(d){
返回d.name;
}),
dataset=dataset.map(函数(d){
返回d.data.map(函数(o){
返回{
姓名:d.name,
y:+o.伯爵,
x:o.time
};
});
}),
stack=d3.layout.stack();
堆栈(数据集);
var dataset=dataset.map(函数(组){
返回组.map(函数(d){
返回{
姓名:d.name,
x:d.y,
y:d.x,
x0:d.y0
};
});
}),
svg=d3。选择('body')
.append('svg')
.attr('width',width+margins.left+margins.right+legendPanel.width)
.attr('height',height+margins.top+margins.bottom)
.append('g')
.attr('transform','translate('+margins.left+','+margins.top+')),
xMax=d3.max(数据集、函数(组){
返回d3.max(组,函数(d){
返回d.x+d.x0;
});
}),
xScale=d3.scale.linear()
.domain([0,xMax])
.范围([0,宽度]),
月份=数据集[0]。映射(函数(d){
返回d.y;
}),
_=控制台日志(月),
yScale=d3.scale.ordinal()
.域名(个月)
.rangeRoundBands([0,高度],.1),
xAxis=d3.svg.axis()
.scale(xScale)
.orient(“底部”),
yAxis=d3.svg.axis()
.刻度(yScale)
.orient(‘左’),
颜色=d3.比例.类别10(),
groups=svg.selectAll('g')
.数据(数据集)
.输入()
.append('g')
.样式(“填充”,功能(d,i){
返回颜色(i);
}),
rects=组。选择全部('rect')
.数据(功能(d){
返回d;
})
.输入()
.append('rect')
.attr('x',函数(d){
返回xScale(d.x0);
})
.attr('y',函数(d,i){
返回y刻度(d.y);
})
.attr(高度),功能(d){
返回yScale.rangeBand();
})
.attr('width',函数(d){
返回x刻度(d.x);
})
.on('mouseover',函数(d){
var xPos=parseFloat(d3.select(this.attr('x'))/2+width/2;
var yPos=parseFloat(d3.select(this.attr('y'))+yScale.rangeBand()/2;
d3.选择(“#工具提示”)
.style('left',xPos+'px')
.style('top',yPos+'px')
.选择(“#值”)
.text(“计数:+d.x+”时间:+d.y+“字符串1”+
“\n字符串2”);
//.文本(d.x+“,+d.y+”,“+d.name”);
d3.选择(“#工具提示”).classed('hidden',false);
})
.on('mouseout',函数(){
d3.选择(“#工具提示”).classed('hidden',true);
})
append('g')
.attr('类','轴')
.attr('transform','translate(0',+height+'))
.呼叫(xAxis);
append('g')
.attr('类','轴')
.呼叫(yAxis);
append('rect')
.attr('填充','黄色')
.attr('宽度',160)
.attr('height',30*dataset.length)
.attr('x',宽度+页边距。左)
.attr('y',0);
系列。forEach(函数(s,i){
append('text')
.attr('填充','黑色')
.attr('x',宽度+边距。左侧+8)
.attr('y',i*24+24)
.文本;
append('rect')
.attr('填充',颜色(一))
.attr('width',60)
.attr('height',20)
.attr('x',宽度+边距。左侧+90)
.attr('y',i*24+6);
});
一百
您的“工具提示”只是一个HTMLspan
;因此,您所需要做的就是为换行符使用一个
:
d3.select('#tooltip')
.style('left', xPos + 'px')
.style('top', yPos + 'px')
.select('#value')
.html("Count: " + d.x + "Time: " + d.y + " String1" + "<br>String2");
你的“工具提示”只是一个HTMLspan
;因此,您所需要做的就是为换行符使用一个
:
d3.select('#tooltip')
.style('left', xPos + 'px')
.style('top', yPos + 'px')
.select('#value')
.html("Count: " + d.x + "Time: " + d.y + " String1" + "<br>String2");
我已经尝试过使用.html元素,但它不起作用。我会再试一次的。@Tushar,是什么方法不起作用?我上面发布的工作代码是根据您的代码片段构建的,它工作得很好。如果没有更多细节,我不确定我能帮你什么。对不起。。。我在编辑时犯了一些错误。上面的代码工作得非常好。很抱歉给您带来不便。谢谢您的帮助。在您的解决方案之前,我已将“\n”与.html一起使用,但这不起作用
与.htmlI配合使用效果良好。htmlI已经尝试使用.html元素,但不起作用。我会再试一次的。@Tushar,是什么方法不起作用?我上面发布的工作代码是根据您的代码片段构建的,它工作得很好。如果没有更多细节,我不确定我能帮你什么。对不起。。。我在编辑时犯了一些错误。上面的代码工作得非常好。很抱歉给您带来不便。谢谢您的帮助。在您的解决方案之前,我已将“\n”与.html一起使用,但这不起作用
可以与.html一起使用