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

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

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

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

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


person user3241848    schedule 26.02.2014    source источник
comment
Ваш образец изображения не загружается.   -  person Patrick Berkeley    schedule 26.02.2014


Ответы (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>, состоящего из различных цветные области, и используйте это, чтобы обвести линию значений.

Вы захотите ознакомиться с различными вариантами элемента узора. В этом руководстве по 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/

person AmeliaBR    schedule 26.02.2014
comment
jsfiddle.net/h45CD/3 Могу я предоставить вам эту ссылку, чтобы вы попробовали ее проиллюстрировать? - person user3241848; 01.03.2014
comment
Не знаю, как это связано. А без данных о том, где вы хотите, чтобы цветовой диапазон был, я не могу вам показать. - person AmeliaBR; 01.03.2014
comment
Я придумал реально работающую диаграмму. Показания в пределах полукруглого диапазона должны быть оранжевыми или какими-либо другими, а те, которые выходят за пределы этого диапазона, например, красный, если он выше MAX, и синий, если он ниже MIN, автоматически изменятся на эти цвета. jsfiddle.net/mTfq8 - person user3241848; 03.03.2014
comment
Чтобы уточнить: хотите ли вы линию, меняющую цвет в зависимости от значения, или линию поверх цветного фона, как в вашем образце изображения? - person AmeliaBR; 03.03.2014
comment
Линии меняют цвет, когда они превышают или не соответствуют определенному значению. Две горизонтальные линии со слегка изогнутой дугой представляют конкретные пороговые значения. Образец изображения проиллюстрировал область на заднем плане, где должны измениться цвета. Еще раз спасибо за ответ и проявленное терпение. - person user3241848; 03.03.2014
comment
Ах, хорошо, в этом случае мой комментарий о том, что намного проще, не точен, но я все же думаю, что есть лучшее решение, чем рисовать линии несколько раз с помощью обтравочных контуров, а именно, создать фон с областями, но вместо того, чтобы рисовать его на экране используйте его как определение шаблона, который применяется для обводки линии. Я дополню ответ подробностями и примерами. - person AmeliaBR; 03.03.2014
comment
Я думаю, вы имеете в виду наложение области на графике с определенной непрозрачностью, которая перекрывает значения столбцов, в результате чего столбцы меняют цвет. Собственно, мой приоритет изменился. Я хочу иметь ввод на той же странице для отдельных столбцов. Взгляните на это: jsfiddle.net/amcharts/6Eb53, созданный тем же парнем из у кого я взял диаграмму, хотя это был другой пост, случай. Есть ли эффективный способ их интеграции? Манипулировали этим примером, чтобы опубликовать необходимые значения столбцов, но не можете интегрировать их в оригинал с пороговыми значениями. - person user3241848; 03.03.2014
comment
Извините @ user3241848, но если вы продолжите менять то, что хотите, мои ответы никогда не решат эту проблему. И получение всевозможного сложного кода от других людей не поможет вам понять основы того, что вы хотите и как это создать. Вы также можете использовать шаблонный подход для гистограммы - вы просто используете шаблон как свойство fill столбцов вместо свойства stroke. Построение графика на основе значений, вводимых пользователем, - это совершенно другой вопрос. - person AmeliaBR; 03.03.2014
comment
Это честно. Хотя я многому учусь и провожу кучу часов, экспериментируя, смешивая различные техники из онлайн-примеров и опытных людей, таких как вы. Спасибо еще раз! - person user3241848; 03.03.2014

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

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

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

person user3241848    schedule 01.04.2014