2013-11-27 2 views
1

Мне нужно настроить цветную легенду для диаграммы рассеяния. Я уже настроил масштаб, и он работает над точками в диаграмме рассеяния, однако то, что я хочу сделать сейчас, это нарисовать маленький квадрат для каждого цвета, заполненный самим цветом, чтобы показать легенду о диаграмме. Нечто подобное в начале моего графика: enter image description hereD3.js ~ размещение прямоугольников с петлей и их раскраска

Я пытался настроить функцию, чтобы сделать их соответствующим образом, но не удалось, вот что я пробовал:

var colore = d3.scale.ordinal() 
    .domain(d3.extent(dataset, function (d) { return d.Peso; })) 
    .range(["#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"]); 

и функции для рисования квадратов :

svg.selectAll("rect") 
    .data(colore.range()) 
    .enter() 
    .append("rect") 
    .attr("fill", function (i) { return colore(i); }) 
    .attr("x", function (i) {for (i=1; i <= colore.range().length; i++) 
     { return (i * 12) + "px"; } 
     }) 
    .attr("y", margin - 8 + "px") 
    .attr("width", 8 + "px") 
    .attr("height", 8 + "px"); 

Это добавляет к элементу SVG 8 квадратов, но уложены на друг друга, как и (красный один): enter image description here

Так что я не знаю, как исправить мои функции, которые, как я предполагаю, являются ошибками. Заранее благодарю за любую помощь!

ответ

2

Проблема в том, что вы не используете data, привязанный к каждому прямоугольнику, но каждый раз перебираете все цвета. Попробуйте что-то вроде этого:

svg.selectAll("rect") 
    .data(colore.range()).enter() 
    .append("rect") 
    .attr("fill", function (color){ return color; }) 
    .attr("x", function (color, index){ return (index * 12) + "px"; }) 
    .attr("y", margin - 8 + "px") 
    .attr("width", 8 + "px") 
    .attr("height", 8 + "px"); 

Главное, следует отметить, что если вы можете передать атрибут функцию, которая принимает объект и индекс в качестве аргументов, которые будут затем применены к каждой системе координат. Используя этот подход, я получаю это:

example output

+0

я решил ее и собирался удалить его, мне не нужно использовать для петель, так как у меня уже есть массив данных, будет редактировать ответ сейчас – tomtomtom

+0

@tomtomtom: вы всегда можете ответить на свой собственный вопрос, чтобы, если у других будет тот же вопрос, они смогут увидеть ответ. Или, если мое решение также будет работать для вас, вы можете поддержать и принять это также :) – mdml

+0

Ok nevermind Я соглашусь с вами как правильно, с этим правилом редактирования! Благодаря :) – tomtomtom

Смежные вопросы