Цвет линии нескольких серий

У меня есть следующая реализация. Она реализована и функциональна. http://dojo.telerik.com/uCIhu

Однако я хотел бы знать, можно ли изменить цвет линии, когда оценка data[i]<60 делает ее красной, data[i]>=60 делает ее синей.

$("#chart").kendoChart({
    series: [{
            name: "Grading",
            color: function(point){return point.value<60 ? "red" : "blue"; },
            width: 1,
            size: 2,
            tooltip: {
                visible: true,
            },
            data: [81, 91, 61, 55, 59, 43, 57, 59, 66, 65, 54, 70, 72.37]}
       ],
   seriesDefaults: {
            type: "line",
            missingValues: "interpolate"

        },
});

person casillas    schedule 17.05.2015    source источник
comment
Да, это так; пожалуйста, добавьте соответствующий код в свой вопрос. Не полагайтесь на то, что мы перейдем на внешний сайт, чтобы помочь вам: сделайте так, чтобы нам было легко помочь вам.   -  person David says reinstate Monica    schedule 18.05.2015
comment
Я добавил логику в свой код.   -  person casillas    schedule 18.05.2015
comment
Ваш связанный Fiddle, похоже, вообще ничего не делает, а «datavis.min.css» — 404. Вам нужно воспроизвести свою проблему на JS Fiddle и опубликовать код, который точно воспроизводит вашу проблему в вашем вопросе. В настоящее время вы обновили свой вопрос, чтобы, по-видимому, изменить вопрос. Добавляйте информацию, а не удаляйте ее (если только она не является совершенно посторонней и ненужной).   -  person David says reinstate Monica    schedule 18.05.2015
comment
Пожалуйста, проверьте это dojo.telerik.com/uCIhu   -  person casillas    schedule 18.05.2015


Ответы (2)


Способ получить несколько цветов на одной линии — применить градиент в качестве цвета обводки. Где-то в вашем HTML вы можете включить скрытый элемент svg с определенным градиентом, например:

  <div style="height: 0px;">
    <svg>
      <defs>    
      <linearGradient id="theGrad" x1="0" x2="0" y1="0" y2="1">
        <stop stop-color="blue" offset="0%"></stop>
        <stop stop-color="blue" offset="40%"></stop>
        <stop stop-color="red" offset="40%"></stop>
        <stop stop-color="red" offset="100%"></stop></linearGradient>
    </defs>
    </svg>
  </div>

ПРИМЕЧАНИЕ. Вы также можете просто создать определение градиента в скрипте и добавить его к диаграмме SVG.

Затем используйте обратный вызов рендеринга виджета диаграммы, чтобы применить градиент к линии:

$("#chart").kendoChart({
    series: [{
       name: "Grading",
       color: function(point){return point.value<60 ? "red" : "blue"; },
       width: 2,
       size: 2,
       tooltip: {
           visible: true,
       },
       data: [81, 95, 61, 55, 59, 5, 57, 59, 66, 65, 54, 70, 72.37]}
   ],
   seriesDefaults: {
       type: "line",
       missingValues: "interpolate"     
   },
   valueAxis: {
       max: 100
   },
   render: function(e) {
       $('#chart svg g [clip-path="url(#kdef2)"] path').css("stroke", "url(#theGrad)");        
   }
});

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

ДЕМО

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

person ezanker    schedule 19.05.2015
comment
Вау, интересное и идеальное решение. Большое спасибо, Эзанкер. - person casillas; 20.05.2015

Да, это возможно, однако код, который вы разместили, не может работать:

function lineColor()
{
  for(i=0;i<data.length;i++){ 
   if{data[i]<60}
    color="red";
   else{color="blue";}
   }
}

Пытаться:

function lineColor(){
  for(i=0; i<data.length; i++){ 
    if(data[i]<60) {color="red";}
    else {color="blue";}
  }
}

В качестве альтернативы просто троичный:

function lineColor(){
  for(i=0; i<data.length; i++){ 
    color=data[i]<60) ? 'red' : 'blue';
  }
}

Я предполагаю, что в цепочке областей видимости есть какой-то идентификатор color.


Редактировать:

В официальной документации указано, что нужно установить series.color в функцию,
в вашем случае: color: function(point){return point.value<60 ? "red" : "blue"; }
Однако я понятия не имею, почему это не работает в вашем jsfiddle.

person GitaarLAB    schedule 17.05.2015
comment
Пожалуйста, обратитесь к моему jsfiddle, мой вопрос на самом деле больше связан с kendo-chart. - person casillas; 18.05.2015
comment
вот почему я сначала попробовал color: function(point){return point.value<60 ? "red" : "blue"; }, но не повезло. - person casillas; 18.05.2015
comment
Я тоже (хотя это ответ в документе). Я также пробовал шестнадцатеричные цвета (с # и без). Я потратил на это почти час, обычно я бы сказал, что сейчас это личное и разобрался, но сегодня у меня куча других дел. Однако я заметил некоторые ошибки в FF «Найдена функция, где ожидался цвет». Можно попробовать загрузить более старую версию кендо. Можно попробовать без jsfiddle. У меня нет идей. Подсказка для последующего/нового вопроса: сведите его к базовому примеру из документа, убедитесь, что он не работает, опубликуйте его как stacksnippet и спросите, почему он не работает (я буду голосовать за) - person GitaarLAB; 18.05.2015
comment
Проверьте это dojo.telerik.com/uCIhu , что я работаю. color function изменяет только маркеры, а не цвет линии, с которыми я имел дело. - person casillas; 18.05.2015
comment
А, очки меняются, это хоть что-то. Вот мысль, предположим, что у вас есть data: [70, 50, 70]. Значение 0 и 2 выше вашего порога 60, значение 1 ниже. Что именно вы хотите? Красный от val_0 до val_1, снова красный от val_1 до val_2? Или красный от val_0 до val_1, затем синий от val_1 до val_2 (или наоборот)? Или измените строку после того, как она пройдет через 60 (это означает, что одна строка синяя, затем красная (от val_0 до val_1), затем следующая строка красная, затем синяя (от val_1 до val_2). Я думаю, что об этом важно подумать, если только для дальнейшего сужения того, что вы хотите точно. - person GitaarLAB; 18.05.2015
comment
Да, точно, детали на этом этапе не очень важны, я хочу видеть только то, что только один массив данных возвращает мне многоцветные линии. - person casillas; 18.05.2015
comment
Я думаю, что ответ на самом деле кроется в этой «детали». Вероятно, вы могли бы / должны предварительно обработать свой массив данных (разделив его на 2 и добавив точки соединения, в зависимости от конечного результата, который вы имеете в виду). Затем постройте получившиеся 2 массива данных. - person GitaarLAB; 18.05.2015