2012-04-13 91 views
11

我正在用KendoUI替換我的網點圖表。我正在顯示分數分佈圖表。我希望所有的酒吧都是相同的顏色,除了中間分數和傳奇酒吧。如何爲單個顏色着色一個獨特的顏色?我怎樣才能讓傳奇變成這種新顏色?如何在KendoUI條形圖中使酒吧變成另一種顏色?

下面是我舊的dotnet製圖條形圖,下面是我試圖用它代替的新的KendoUI圖表。我只需要正確地着色即可開始生意。任何幫助表示讚賞。

enter image description here

回答

18

更新:我要離開這條線下面的答案完好的情況下,也有一些在那裏誰使用的是舊版本,但per a later comment,KendoUI現在允許您覆蓋在個別點風格系列。


我不相信你可以在當前版本。這就是說,你可以繞過這個限制。

您需要創建兩個數據系列 - 一個用於突出顯示的數據,另一個用於其他所有數據。添加到你的圖表,並將它們設置爲堆疊。

這裏有一個jsFiddle我放在一起說明:http://jsfiddle.net/LyndsySimon/9VZdS/。這取決於KendoUI的CDN,所以如果它在未來打破,我表示歉意。

這裏是JavaScript以供參考:

$(function() { 
    var dataset = new Array(1,2,3,null,5,6); 
    var highlighted = new Array(null,null,null,4,null,null); 

    $('#chart').kendoChart({ 
     theme: 'metro', 
     seriesDefaults: { 
      type: 'column', 
      stack: true 
     }, 
     series: [ 
      { 
       name: 'Not Highlighted', 
       data: dataset, 
       color: '#609' 
      }, 
      { 
       name: 'Highlighted', 
       data: highlighted, 
       color: '#f03' 
      } 
     ] 
    }) 
});​ 
+1

完善。感謝你的工作。你得到一個+1,當我22小時後,我會獎賞你的賞金。我建議爲此得到一個真實的賬戶;) – Chev 2012-04-16 16:11:21

0

這是目前不可能與當前KendoUI版本。

這是他們的待辦事項列表。

http://www.kendoui.com/forums/dataviz/chart/change-bar-column-color-for-each-point.aspx

可以有一種變通方法,如線程我已經在這裏放說,這將是描述一系列您需要的每個顏色。它對我來說看起來效率很低,但它是目前唯一的方法。如果你只有一個圖表,你可以這樣做。否則,請使用此功能等待新版本的KendoUI。

+0

如果你不得不這麼做,LaGrandMere會說得很好。我會創建一個包裝函數並擴展Kendo的配置選項來處理這個問題。 稍後,當Kendo引入此功能時,您可以重構包裝以使用本機實現,並隨着您的一天繼續前進。 – 2012-04-16 18:51:43

1

你可以破解系統生成的SVG。我爲圖表提供了一個包含每個欄的顏色的模型。例如:

public class Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public string Colour { get; set; } 
    public decimal Score { get; set; } 
} 

它被用作圖表上的一個系列。視圖則看起來像:

@(Html.Telerik().Chart(Model) 
    .Name("AverageScores") 
    .Theme("Simple") 
    .HtmlAttributes(new {style = "height: 500px"}) 
    .Series(series => series.Column(s => s.Score).Name("Name").Color("Blue")) 
    .SeriesDefaults(sd => sd.Column().Labels(l => 
               { 
                l.Visible(true); 
                l.Format("{0}%"); 
               })) 
    .Title("Mean Percentage Scores") 
    .Legend(builder => 
       { 
        builder.Position(ChartLegendPosition.Bottom); 
        builder.Visible(false); 
       }) 
    .CategoryAxis(ca => ca.Categories(x => x.Code)) 
    .Tooltip(builder => 
       { 
        builder.Visible(true); 
        builder.Format("{0}%"); 
        builder.Template("<#= dataItem.Name #><br/><#= value #>%"); 
       }) 
    .ValueAxis(va => va.Numeric().Labels(a => a.Format("{0}%")).Min(0).Max(100) 
    ) 
) 

@section BelowTelerikScriptRegistrar 
{ 
<script type="text/javascript"> 


    function setAverageScoresColours() { 
     var data = $('#AverageScores').data("tChart").options.series[0].dataItems; 
     if (data != null) { 
      for (var i = 0; i < data.length; i++) { 
       var averageScore = data[i]; 
       $($($('div#AverageScores svg g')[i]).children('path')[0]).attr('fill', '#' + averageScore.Colour); 
       $($($('div#AverageScores svg g')[i]).children('path')[0]).attr('stroke', '#' + averageScore.Colour); 
      } 
     } 
    } 

    $(document).ready(function() { 
     setAverageScoresColours(); 
    }) 
</script> 
} 

BelowTelerikScriptRegistrar必須Html.Telerik()ScriptRegistrar後發生的部分()被調用。

這將適用於Chrome,Firefox和IE10。我注意到有多個圖表和SVG生成時間的問題。不幸的是,你可能必須在setTimeout函數中包裝setAverageScoresColours()以確保SVG已經生成,但它似乎只適用於一個圖表。

有點亂糟糟,但比管理很多系列更容易。

而對於KendoUI(我已編輯...):

<div class="chart-wrapper"> 
    <div id="chart"></div> 
</div> 

<script> 
function createChart() { 
    $("#chart").kendoChart({ 
     theme: $(document).data("kendoSkin") || "default", 
     title: { 
      text: "Internet Users" 
     }, 
     legend: { 
      position: "bottom" 
     }, 
     seriesDefaults: { 
      type: "column" 
     }, 
     series: [{ 
      name: "World", 
      data: [15.7, 16.7, 20, 23.5, 26.6] 
     }], 
     valueAxis: { 
      labels: { 
       format: "{0}%" 
      } 
     }, 
     categoryAxis: { 
      categories: [2005, 2006, 2007, 2008, 2009] 
     }, 
     tooltip: { 
      visible: true, 
      format: "{0}%" 
     } 
    }); 
} 

$(document).ready(function() { 
    setTimeout(function() { 
     // Initialize the chart with a delay to make sure 
     // the initial animation is visible 
     createChart(); 
     $($($('div#chart svg g')[0]).children('path')[0]).attr('fill', '#123'); 
     $($($('div#chart svg g')[1]).children('path')[0]).attr('fill', '#321'); 
     $($($('div#chart svg g')[2]).children('path')[0]).attr('fill', '#213'); 
     $($($('div#chart svg g')[3]).children('path')[0]).attr('fill', '#312'); 
     $($($('div#chart svg g')[4]).children('path')[0]).attr('fill', '#132'); 
    }, 400); 
}); 
</script> 
15

從2012年第2季度開始,bar系列支持將點顏色綁定到數據項字段。

這是通過colorField option完成的。 Binding to local data在線示例演示了它。

無論是劍道UI和ASP.NET MVC的傳統包裝暴露它作爲一個選項:

.Series(series => 
{ 
    series.Bar(model => model.Value, model => model.Color) 
     .Name("United States"); 
}) 

全系列重載可以看出here

+0

優秀。我更新了我接受的答案以指出您的評論。 – 2013-09-23 18:17:09

0

另一種方式在運行時可以做到這一點是使用函數返回的顏色。

API reference

下面是一個例子代碼:

<div id="chart"></div> 
<script> 
$("#chart").kendoChart({ 
    series: [{ 
    data: [1, 2], 
    color: function(point) { 
     if (point.value > 1) { 
     return "red"; 
     } 

     // use the default series theme color 
    } 
    }] 
}); 
</script> 
相關問題