Javascript 价值:7345 }, { “时间”:“2023年”, “价值”:5345 }]; const container=d3.select('#graph'); const divWidth=parseInt(container.style('width');

Javascript 价值:7345 }, { “时间”:“2023年”, “价值”:5345 }]; const container=d3.select('#graph'); const divWidth=parseInt(container.style('width'); ,javascript,html,css,d3.js,Javascript,Html,Css,D3.js,价值:7345 }, { “时间”:“2023年”, “价值”:5345 }]; const container=d3.select('#graph'); const divWidth=parseInt(container.style('width'); const divHeight=parseInt(container.style('height')); //考虑这个宽度和高度对于DIV“图形”是动态的,因为我正在尝试响应设计。 常量边距={top:30,right:50,bottom:50

价值:7345 }, { “时间”:“2023年”, “价值”:5345 }]; const container=d3.select('#graph'); const divWidth=parseInt(container.style('width'); const divHeight=parseInt(container.style('height')); //考虑这个宽度和高度对于DIV“图形”是动态的,因为我正在尝试响应设计。 常量边距={top:30,right:50,bottom:50,left:50}; const width=divWidth-margin.left-margin.right; const height=divHeight-margin.top-margin.bottom; //在可视化节点(即Dome节点)中添加svg const svg=container.append(“svg”) .attr(“宽度”,divWidth) .attr(“高度”,divHeight); const svgG=svg.append(“g”) .attr(“transform”,`translate(${margin.left},${margin.top})`); 常量xScale=d3.scaleBand() .domain(barData.map(d=>d.Time)) .范围([0,宽度]); 常数xAxis=d3.axisBottom(xScale); //为x轴的svg添加g属性 svgG.append('g') .attr(“transform”,`translate(0,${height})`) .呼叫(xAxis); 常量yAxisMax=barData.reduce((最大,项目)=>Math.max(最大,项目值),0)*1.5; 常量yScale=d3.scaleLinear() .domain([0,yAxisMax]) .范围([高度,0]); 常数yAxis=d3.axisLeft(yScale).ticks(4); svgG.append('g') .呼叫(yAxis); 常量条=svgG.selectAll('g.bar') .数据(barData) .输入() .append('g') .classed('bar',true) .attr('transform',d=>`translate(${xScale(d.Time)+xScale.bandwidth()/2},0)`) bar.append('rect') .attr('x',-20) .attr('宽度',40) .attr('y',d=>yScale(d.Value)) .attr('height',d=>height-yScale(d.Value)) .style('填充','蓝色') bar.append('text') .text(d=>d.Value) .attr('text-anchor','middle') .attr('y',d=>yScale(d.Value)) .attr('dy',-5) 过滤条((d,i)=>i`M5,${yScale(d.Value)-20}V${Math.min(yScale(d.Value),yScale(barData[i+1].Value))-60}H${xScale.bandwidth()-5}V${yScale(barData[i+1].Value)-20}`) .style('stroke','gray') .style('填充','无') .attr('marker-end','url(#箭头)' 过滤条((d,i)=>iMath.min(yScale(d.Value),yScale(barData[i+1].Value))-70) .attr('width',xScale.bandwidth()-30) .attr('height',20) .attr('rx',10) .style('填充','白色') .风格(“笔画”、“灰色”); 过滤条((d,i)=>i`${barData[i+1].Value>d.Value?'+':'-'}${Math.round((barData[i+1].Value/d.Value*100)-100)}%`) .attr('x',xScale.bandwidth()/2) .attr('y',(d,i)=>Math.min(yScale(d.Value),yScale(barData[i+1].Value))-56) .attr('text-anchor','middle') .style('fill','black');
#图形
{
宽度:500px;
高度:700px
}
正文{
字体大小:12px;
字体系列:“Ubuntu”;
}


我能理解在尺寸(1)和第一个与最后一个(3)之间的差异方面需要做出响应。我不理解的是问题2(反向差异计算).如何定义哪对值应显示反向差异?好的,对于问题2,计算基本上是从最后一个条开始,然后继续到第一个条。例如:(6453-7345)/7345=-12%和(6453-5388)/6453=-17%。我将编辑帖子,并在其中添加相同的内容。我希望这一点现在已经明确。如果没有,请让我知道。:)我知道如何计算,我不知道如何显示两个方向的变化……我还认为一次完成所有问题需要大量的编码。我建议将问题分为两个步骤(一个用于响应,第二个用于差异计算)否则它将很难管理…是的,理解,这就是为什么我一开始试图使其响应。我只分享了第一个问题相关的代码。其他问题将在以后处理。你能帮助我响应的实现吗。我正在努力,但仍在挣扎。你的帮助将是非常值得赞赏的。谢谢你迈克尔,哟你真是太棒了。它真的帮助了我理解和开始很多。我将尝试解决第二和第三个问题,如果我需要任何帮助或在任何地方卡住,那么我将提出一个单独的线程。非常感谢:)我只是想知道,让同一张图表在水平方向上工作是简单的吗?还是代码有很多变化?如果没有不同的标签,它会相对容易:你只需切换Y和X刻度/轴,并将
Y
height
替换为
X
width
的条形图。对于标签,这会更加困难,因为路径计算是基于布局的…嗨,Michael,我明白了,也许我稍后会检查horizontal属性,但需要在下面提供帮助-->我尝试在barData数组中使用一些-ve值,但它没有按预期工作,因为y轴默认从“0”开始,但当我使用“0”通过动态最小值设置默认值时常量yAxisMin=barData.reduce((最小,项目)=>Math.min(最小,项目值),0)*1.5;“,那么它也无法按预期工作。是否需要进行任何其他更改?请您通过传递-ve值来更新共享代码。您的帮助非常有用。:)我不确定我是否理解此问题。什么是-ve值?