Javascript 如何在KendoUI条形图中使条形图具有不同的颜色?

Javascript 如何在KendoUI条形图中使条形图具有不同的颜色?,javascript,jquery,asp.net,telerik,kendo-ui,Javascript,Jquery,Asp.net,Telerik,Kendo Ui,我正在用KendoUI替换我的网络图表。我正在展示一张分数分布图。我希望所有的酒吧都是相同的颜色,除了中位数和图例酒吧。如何将单个条形图涂成独特的颜色?我该如何将图例涂成这种新颜色 下面是我以前的dotnet图表条形图,下面是我正在尝试用新的KendoUI图表替换它。我只需要把颜色弄好,我们就可以做生意了。感谢您的帮助 更新:我保留这行下面的答案,以防有人使用旧版本,但是,KendoUI现在允许您覆盖系列中各个点的样式 我不相信你能,在目前的版本中。也就是说,你可以绕过限制 您需要创建两个数据

我正在用KendoUI替换我的网络图表。我正在展示一张分数分布图。我希望所有的酒吧都是相同的颜色,除了中位数和图例酒吧。如何将单个条形图涂成独特的颜色?我该如何将图例涂成这种新颜色

下面是我以前的dotnet图表条形图,下面是我正在尝试用新的KendoUI图表替换它。我只需要把颜色弄好,我们就可以做生意了。感谢您的帮助


更新:我保留这行下面的答案,以防有人使用旧版本,但是,KendoUI现在允许您覆盖系列中各个点的样式


我不相信你能,在目前的版本中。也就是说,你可以绕过限制

您需要创建两个数据系列—一个用于突出显示的数据,另一个用于所有其他数据。将两者添加到图表中,并将其设置为堆叠

下面是我放在一起演示的JSFIDLE:。这取决于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'
            }
        ]
    })
});​

这在当前的KendoUI版本中是不可能的

这在他们的待办事项清单上


可以有一种解决方法,正如我在这里的帖子中所说的,它将为您需要的每种颜色描述一个系列。对我来说,这看起来效率很低,但这是目前唯一的方法。如果你只有一张图表,你可以做。否则,等待具有此功能的新版本KendoUI。

您可以破解系统生成的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>
}
@(Html.Telerik().Chart(模型)
.Name(“平均分数”)
.主题(“简单”)
.HtmlAttributes(新的{style=“height:500px”})
.Series(Series=>Series.Column(s=>s.Score).Name(“Name”).Color(“Blue”))
.seriesDefault(sd=>sd.Column().Labels(l=>
{
l、 可见(真实);
l、 格式(“{0}%”);
}))
.标题(“平均百分比分数”)
.Legend(生成器=>
{
生成器位置(ChartLegendPosition.Bottom);
生成器。可见(假);
})
.CategoryAxis(ca=>ca.Categories(x=>x.Code))
.工具提示(生成器=>
{
builder.Visible(true);
格式(“{0}%”);
builder.Template(“
%”); }) .ValueAxis(va=>va.Numeric().Labels(a=>a.Format(“{0}%”)).Min(0).Max(100) ) ) @下面的章节是ElerIkscript { 函数setAverageScoresColours(){ var数据=$(“#AverageScores”).data(“tChart”).options.series[0]。数据项; 如果(数据!=null){ 对于(变量i=0;i
下面的部分必须在调用Html.Telerik().scriptRegistrator()之后出现

这将适用于Chrome、Firefox和IE10。我注意到在生成SVG的过程中,多重图表和时间安排存在问题。不幸的是,您可能必须在setTimeout函数中包装setAverageScoresColours(),以确保生成了SVG,但它似乎只适用于一个图表

有点老套,但比管理很多系列更容易

对于KendoUI(我为…)编辑过:


函数createChart(){
$(“#图表”)。肯多卡特({
主题:$(文档).data(“肯多斯金”)| |“默认值”,
标题:{
正文:“互联网用户”
},
图例:{
位置:“底部”
},
系列默认值:{
类型:“列”
},
系列:[{
名称:“世界”,
数据:[15.7,16.7,20,23.5,26.6]
}],
valueAxis:{
标签:{
格式:{0}%
}
},
类别:{
类别:[2005、2006、2007、2008、2009]
},
工具提示:{
可见:对,
格式:{0}%
}
});
}
$(文档).ready(函数(){
setTimeout(函数(){
//延迟初始化图表以确保
//初始动画可见
createChart();
$($($('div#chart svg')[0]).children('path')[0]).attr('fill','#123');
$($($('div#chart svg g')[1]).children('path')[0]).attr('fill','#321');
$($($('div#chart svg g')[2])。子项('path')[0])。属性('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);
});

从2012年第2季度开始,bar系列支持将点颜色绑定到数据项字段

这是通过。在线示例演示了这一点

Kendo UI和ASP.NET MVC的旧包装器都将其作为一个选项公开:

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

所有系列的重载都可以看到。

Telerik最近发布了一个剑道UI Data Vis Theme Roller


运行时执行此操作的另一种方法是使用返回颜色的函数

下面是一个示例代码:

<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>

$(“#图表”)。肯多卡特({
<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>