Линейный график / график с нерегулярным пороговым полем

Нужно создать гистограмму с нерегулярным цветным пороговым полем на заднем плане, чтобы каждая точка данных имела свой собственный набор минимальных / максимальных порогов, который в конечном итоге выглядел бы примерно так: http://dcalvitti.webs.com/plant/SAMPLE.png

Посмотрел примеры D3 как этот: http://bl.ocks.org/mbostock/4062844

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

Заранее спасибо..

2 ответа

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

Для рисования цветного фона используйте генератор области пути, созданный с d3.svg.area(), Установить y0 функция доступа, чтобы извлечь ваше минимальное значение для каждой точки в вашем массиве данных, и y1 функция доступа для извлечения максимального значения.

Затем нарисуйте линию поверх обычного линейного графа с d3.svg.line() генератор пути.

Рабочий пример, адаптированный из скрипок в комментариях: http://jsfiddle.net/h45CD/12/
(Примечание: я закомментировал половину набора данных, так как значения "год" были повторены, не уверен, что это должно было представлять.)

Ключевой код:

// Define the value line path generator
var line = d3.svg.line()                        
    .x( function(d) { return x(d.year); } ) 
    .y( function(d) { return y(d.temp); } );

// Define the area path generator
var area = d3.svg.area()
    .x(  function(d) {  return x(d.year); } )
    .y0( function(d) { return y(d.min); } )
    .y1( function(d) { return y(d.max); } );

/* ... */

// Add the background area showing the historic range
svg.append("path")
   .datum(data)
   .attr("class", "historicRange")
   .attr("d", area);

// Add the value line 
svg.append("path") 
    .datum(data)
    .attr("class", "dataline")
    .attr("d", line);

Редактировать на основе комментариев

Если вы хотите, чтобы линия меняла цвет в зависимости от исторических значений, в отличие от линии, нарисованной поверх диапазона фона, наиболее простым решением, вероятно, является создание <pattern> элемент, состоящий из разноцветных областей, и используйте его для обводки строки значения.

Вы захотите ознакомиться с различными вариантами элемента pattern. Это руководство по MDN имеет хорошее введение, или вы можете погрузиться в полные спецификации W3.

В этой ситуации мы хотим, чтобы размер шаблона определялся и располагался относительно системы координат, используемой для рисования линии, независимо от размера или формы самой линии. Это означает, что мы будем устанавливать как patternUnits и patternContentUnits быть userSpaceOnUse, height а также width шаблона будет высота и ширина области построения.

Внутри шаблона мы нарисуем область, представляющую диапазон max-min, но нам также нужно нарисовать отдельные области разными цветами для значений выше max и значений ниже min. Мы можем использовать один и тот же генератор области для каждого, но нам нужно каждый раз менять функции доступа y0/y1.

Ключевой код:

// Add the pattern showing the historic range
var pattern =  defs.append("pattern")
    .datum(data) //add the data to the <pattern> element
                //so it will be inherited by each <path> we append
    .attr({
        "patternUnits":"userSpaceOnUse",
        "patternContentUnits":"userSpaceOnUse",
        "width": width,
        "height": height
    })
    .attr("id", "strokePattern");

pattern.append("path")
   .attr("class", "historicRange between")
   .attr("d", area);

pattern.append("path")
   .attr("class", "historicRange above")
   .attr("d", area.y1( 0 )
                  .y0( function(d){return y(d.max);} )
        );

pattern.append("path")
   .attr("class", "historicRange below")
   .attr("d", area.y1( function(d){return y(d.min);}  )
                  .y0( height )
        );

// Add the value line 
plot.append("path")             
    .datum(data)            
    .attr("class", "dataline")  
    .attr("d", line)
    .style("stroke", "url(#strokePattern)");        

Рабочий пример: http://jsfiddle.net/h45CD/14/

Я включил ссылку на веб-страницу с диаграммами, созданными мной на основе AMCharts и с помощью основателя этого веб-сайта. Содержит несколько примеров вышеуказанного вопроса и многое другое..

http://dcalvitti.webs.com/SAMPLE/NEWWEBINDEX.html

Предоставленные графики все еще работают. Например, у AMcharts есть функция, которая обрезает цвет линии выше / ниже определенного значения, о котором я не знал, поэтому еще предстоит проделать большую работу. Я провел много недель в чартах и ​​думал, что поделюсь. Я уверен, что кто-то найдет что-то новое здесь, в будущем...

Другие вопросы по тегам