目前我正在编写一个水平轴上的堆叠条形图的代码。但是我不知道如何设置.attr(x,...)来确保输入的每个rect都在条的末尾,从而填满空间。你能帮忙吗?
const bars = d3.select('#bars').append('svg').attr('width', 800).attr('height', 200);
d3.json('HHPro.json').then(data => {
var bar1Data = [{
position: 1,
label: '70k',
value: data.lemon.HH_Income.seventyK //1000
},
{
position: 2,
label: '71K - 149K',
value: data.lemon.HH_Income.seventyoneK_onefortynineK // 800
},
];
//sort bars based on value
bar1Data = bar1Data.sort(function(a, b) {
return d3.descending(a.value, b.value);
})
console.log(d3.sum(bar1Data, d => d.value))
var colorScale = d3.scaleOrdinal()
.range(["#E8A82B", "#000000"]);
const x = d3.scaleLinear()
.domain([0, d3.sum(bar1Data, d => d.value)])
.range([0, 800]);
y = d3.scaleLinear()
.domain([0, d3.max(bar1Data).value])
.rangeRound([200])
//Join data to rects
const rects = bars.selectAll('rect')
.data(bar1Data)
rects
.attr('width', (bar1Data) => {
return x(bar1Data.value)
})
.attr('height', 100)
.attr('x', 20)
.attr('y', 20)
rects.enter()
.append('rect')
.attr('width', (bar1Data) => {
return x(bar1Data.value)
})
.attr('height', 200)
.attr('x', 0) //BUT WHAT IS THIS??
.attr('y', 100)
.style("fill", (d, i) => colorScale(i));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="bars"></div>
如果我正确理解你的问题,你想把杠叠起来。有两种方法可以做到。第一种是手工完成,正如我在你的另一个问题中所展示的:
const bars = d3.select('#bars').append('svg').attr('width', 800).attr('height', 200);
var bar1Data = [{
position: 1,
label: '70k',
value: 1000
},
{
position: 2,
label: '71K - 149K',
value: 800
},
];
//sort bars based on value
bar1Data = bar1Data.sort(function(a, b) {
return d3.descending(a.value, b.value);
})
console.log(d3.sum(bar1Data, d => d.value))
var colorScale = d3.scaleOrdinal()
.range(["#E8A82B", "#000000"]);
const x = d3.scaleLinear()
.domain([0, d3.sum(bar1Data, d => d.value)])
.range([0, 800]);
y = d3.scaleLinear()
.domain([0, d3.max(bar1Data).value])
.rangeRound([200])
//Join data to rects
const rects = bars.selectAll('rect')
.data(bar1Data)
rects
.attr('width', (d) => {
return x(d.value)
})
.attr('height', 100)
.attr('x', 20)
.attr('y', 20)
rects.enter()
.append('rect')
.attr('width', (d) => {
return x(d.value)
})
.attr('height', 200)
.attr('x', function(d, i) {
// Note that I use `.map` here to take only the `.value` attribute
// from the data and create an array of numbers. Then I pass it to `x`
// to be transformed (could also be the other way around if you'd like,
// so sum(bar1Data.map((e) => x(e.value)), 0, i)
return x(sum(bar1Data.map((e) => e.value), 0, i));
})
.attr('y', 100)
.style("fill", (d, i) => colorScale(i));
function sum(array, start, end) {
var total = 0;
for (var i = start; i < end; i++) total += array[i];
return total;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="bars"></div>
关于我的图表,我有以下问题/疑问: > 如何防止正确的 y 轴刻度值被部分删除或进入图表内部? 当我使用yValuesTripId作为左和右y轴域的域时,图表绘制得很好。如何使用yAxisFirstStopTimes作为左y轴域值和yAxisLastStopTimes作为右y轴值使其绘制精细? 您可以单击此处查看或编辑图表: 代码如下:
我试图在3.2.0中创建一个混合堆叠的水平条形图和折线图Charts.js。 预期行为:一个轴在底部的堆叠条,包括轴标题和一个轴在顶部的折线图。 实际行为:底部的所有轴都显示了一个额外的轴,该轴似乎与任何数据集都不对应。不显示轴标题。 注意:代码中有几个条形的值为零,根据生成的数据,这些值可以是非零的。 我的代码: jsfiddle 当前行为的屏幕截图
我想知道这是否可以在Datadog中实现。我有一个在1个度量-现在数据通过多个标记发布到Datadog,例如,,可能还有10个不同的标签。 我试图在仪表板中创建Datadog图表,它将在堆叠条形图中显示实体计数的前5个标记。我知道添加更多查询的选项,但由于我不确定将来会有哪些实体可用,我希望datadog总是在仪表板中动态显示前5个实体(而不是在查询中指定要显示的标记)。这就是我目前拥有的(它完成
我有以下不同月份的数据 一月:[1,5,3] Feb:[10,5] 三月:[4,8] 四月:[7] 可能:[3,1,5,0,7] 我想生成如下所示的条形图 现在,我有以下代码,我想知道如何生成如上图所示的条形图。 }); 非常感谢。
Highcharts 条形图 以下实例演示了堆叠条形图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。 配置 plotOptions 配置图表堆叠使用 plotOptions.series.stacking,并设置为 "normal"。如果禁用堆叠可设置为 null , "normal" 通过值设置堆叠, "percent" 堆叠则按百分比。 v
问题内容: 我正在尝试使用创建水平堆叠的条形图,但是我看不到如何使条形实际堆叠,而不是全部从y轴开始。 这是我的测试代码。 看到tcaswell的评论后,编辑使用kwarg。 这似乎是正确的方法,但是如果没有特定条形的数据,则尝试失败,因为它正尝试添加到随后返回的值。 问题答案: 由于您使用的是熊猫,因此值得一提的是,您可以在本地进行堆积条形图: 请参阅 文档的可视化部分。