2014-07-17 2 views
7

У меня есть составной график двух линейных диаграмм. Для одного из них я пытаюсь применить пользовательский диапазон цвета на основе значения каждой точки на линии:dc.js линейная диаграмма с диапазоном цветов

.colors(['rgb(215,48,39)','rgb(244,109,67)','rgb(253,174,97)','rgb(254,224,144)']) 
.colorDomain ([0,3]) 
.colorAccessor (d,i) -> 
    if d.points[i].data.value.avg > 50 
    return 0 
    else 
    return 3 

Проблема я получаю только один цвет для всего графа ... Не говоря d возвращает в качестве объекта всех точек вместо одной точки ... (может быть намек на проблемы?)

This is the result i'm getting...

я делаю что-то здесь не так, и/или есть более простой способ сделать это?

+1

только FYI, я дал другой линии непрозрачность 0, чтобы не путать ее с этим. – Luiz

+0

Проблема на https://github.com/dc-js/dc.js/issues/469 может иметь отношение к этому. –

+0

Если вы пытаетесь изменить цвет разных сегментов одной строки, это определенно не поддерживается, и вам придется делать это с помощью [renderlet] (https://github.com/dc-js/dc. JS/BLOB/мастер/веб/документы/api-latest.md # renderletrenderletfunction). Сложенные диаграммы (строка и строка) предполагают, что цвет будет назначен для каждого стека; поэтому все точки данных передаются. – Gordon

ответ

6

Вы не получили ответа, поэтому я попытаюсь изучить его с вами.

Во-первых, я создал скрипку по адресу http://jsfiddle.net/djmartin_umich/4ZwaG/.

.colors(['rgb(215,48,39)', 'rgb(244,109,67)', 'rgb(253,174,97)', 'rgb(254,224,144)' ]) 
.colorDomain ([0,3]) 
.colorAccessor(function(d, i){ 
    if(d[i] && d[i].data.value > 150) 
    return 3; 
    else if(d.data.value > 150) 
    return 2; 
    else return 1; 
}); 

Мне пришлось поиграть с аксессуаром цвета, чтобы заставить его прекратить бросать ошибки. Метод дважды вызывался с массивом элементов и дважды для каждого элемента массива (24 раза всего).

После того, как я получил его компиляции я проверил график и увидел это:

enter image description here

Диаграмма имеет элемент пути, который определяет линию и кучу кругов, которые определяют точки на линии. Точки являются частью инструментальной подсказки, отображаемой при наведении курсора на разные точки линии.

Путь, по-видимому, окрашен значением, возвращаемым при передаче массива значений, и точки наведения на линии окрашены значением, возвращаемым для этого элемента.

Таким образом, путь линии задан одним цветом. Похоже, ваше ожидание заключается в том, что разные части строки будут по-разному окрашены в зависимости от их значения y, но это не то, как линия отображается.

В статье по адресу http://www.d3noob.org/2013/01/applying-colour-gradient-to-graph-line.html описано, как вы можете использовать градиенты для достижения желаемого эффекта. Я считаю, что автор «жестко кодирует» точки старта и остановки для каждого градиента, поэтому он не даст вам пути к вашему ответу, но он должен помочь вам начать работу.

Надеюсь, это поможет! -DJ

+0

Да, я думаю, что это ближе.Но тем не менее, градиент изменяется вдоль координат холста («избыточная кодировка», как говорит Майк) ... Я не вижу способа изменить градиент вдоль другого измерения, которое не является одной из координат холста. Я думаю, что вам нужно будет разбить линию на сегменты, а затем применить отдельные градиенты к каждому сегменту. Прямо сейчас dc.js не позволяет вам разбить строки. – Gordon

+0

@ Gordon как насчет попытки смещения градиента? например, 0% до 50% сегмента 1 и 50.001% до 100% - это сегмент2, я не очень хорошо понимаю этот вопрос, чего этого хотят мужчины, если этот http://bl.ocks.org/mbostock/3969722 тот, который он хочет достигнуть, сыграть масштаб, чтобы определить смещение, масштаб (0,100) к вашей точке y, градиент рисования – KEKUATAN

+0

Да, я плохо себя чувствую, когда истекает щедрость, но я не вижу, как это сделать. Если градиент не синхронизирован с Y, вам определенно придется разбить линию на отдельные объекты для каждого сегмента, потому что цвета не обязательно будут согласованы между сегментами. Это очень много работы, так как вы в значительной степени уничтожаете все, что было dc.js, и начинаете с нуля. – Gordon