从csv加载数据,但以不同的方式表示数据D3-水平堆叠条
我正在努力取得一些成就,但我不知道如何实现它 我在data.csv文件中有一个示例数据,如下所示:从csv加载数据,但以不同的方式表示数据D3-水平堆叠条,csv,d3.js,Csv,D3.js,我正在努力取得一些成就,但我不知道如何实现它 我在data.csv文件中有一个示例数据,如下所示: State,p1,p2,p3,p4,p5,p6,p7 AL,0.5,0.5,0.5,1,1,1,1,1,1 AK,1,1,1,1,1,1,1,1,1 现在,每个数据值是100。这看起来不错,但如果我更改了值,我的条形图也会更改,需要将其固定(x轴应始终为0-7),因为在这种情况下,它表示一周的数据 我不希望图表依赖于数据的原因是,数据将仅用于颜色表示,而不用于宽度。所以,如果值在80-100之间
State,p1,p2,p3,p4,p5,p6,p7
AL,0.5,0.5,0.5,1,1,1,1,1,1
AK,1,1,1,1,1,1,1,1,1
现在,每个数据值是100。这看起来不错,但如果我更改了值,我的条形图也会更改,需要将其固定(x轴应始终为0-7),因为在这种情况下,它表示一周的数据
我不希望图表依赖于数据的原因是,数据将仅用于颜色表示,而不用于宽度。所以,如果值在80-100之间,则将其涂成绿色。但我以后会弄明白的
我在Highcharts中获得了期望的结果,但我更喜欢D3
我在这里用Highcharts做的,我想得到这样的东西:
在阅读了r之后,我为我的案例实现了相同的代码:来自@mbostock
谢谢你的帮助 以下是我的解决方案:
首先,因为这里最重要的事情是根据值为条形图着色,所以使用阈值刻度:
var color = d3.scale.threshold()
.domain([0.25, 0.75])
.range(['green', 'yellow', 'red']);
在本例中,如果该值小于0.25,则该条为绿色,介于0.25和0.75之间,该条为黄色,超过0.75时,该条为红色。无论如何,这只是一个例子,让你得到的想法,改变领域和范围的方式,你想要的
之后,将值放入ages
数组:
data.forEach(function(d) {
var y0 = 0;
d.ages = agesDomain.map(function(name) {
return {
name: name,
value: d[name],
y0: y0,
y1: y0 += +d[name]
};
});
d.total = d.ages[d.ages.length - 1].y1;
});
最后,将所有条设置为相同的宽度,并按以下值为其上色:
state.selectAll("rect")
.data(function(d) {
return d.ages;
})
.enter().append("rect")
.attr("height", y.rangeBand())
.attr("x", function(d, i) {
return x(i);
})
.attr("width", x(1))
.style("fill", function(d) {
return color(d.value);
});
这是您的问题,我更改了数据只是为了使图表更加多样化:我认为这是数据验证的经典问题。我可以在csv文件中输入我想要的任何值,但是代码应该决定该值是有效的还是在范围内。因此,您从csv获取数据,然后检查x轴的值是否在1到7之间。如果较低,则将其设置为1;如果较大,则将其设置为7。如果在1和7之间,则使用该值。就这么简单,谢谢你,弗拉德。我还是D3的新手,所以我不知道该把代码放在哪里。你说的完全有道理。这正是我需要的。我用data.forEach编写了一堆if语句,但它看起来太难看了。但它是有效的。你的问题是什么?我想我解决了它,但它看起来相当愚蠢。我希望直观地表示数据值,因为它们都是相同的,尽管它们不是。所以,若数据值为0.5,在图表上表示为1。如果数据值为0.2,则表示为1。我是通过在csv()callback.Gerardo中编写if-else语句得到的。。。你让我高兴极了!非常感谢你!!!这正是我需要的!!!!我真是太感谢你了@Nikki,因为你是S.O.的新人:说“谢谢”的最好方式就是接受答案,谢谢!我还不能投票,但我接受了答案。再次感谢您编辑我的问题!我很感激!