【问题标题】:Is it possible, to highlight bars in Dimple.js bar chart, based on y-axis value?是否可以根据 y 轴值突出显示 Dimple.js 条形图中的条形?
【发布时间】:2016-09-02 11:41:09
【问题描述】:

我只是想知道在 Dimple.js 中是否有可能根据 y 轴值突出显示条形?我有一个包含 3 个系列的条形图 - X 作为 CategoryAxis(RefNum),Y 作为 MeasureAxis(以 K 为单位),Y2 作为 PctAxis(以 % 为单位)。在条形图的顶部,我们画了一条线,使用 javascript 计算(例如帕累托图)。所以想法是改变那些条的颜色,它们超过 80%(Y2),或者可能是灰色的,以及一些如何突出它们。正在挖掘 Dimple.js API 文档,但那里什么也没有……另外,我尝试在

上创建一个简单的 IF ELSE 语句

myChart.defaultColors= [ 新酒窝.color("蓝色"), ];

但是没有任何运气...有可能吗,因为我找不到任何文档或教程...理想情况下,我们希望有这样的东西: 对d3不是很熟悉,也许可以通过它获得一些解决方案?我们使用 dimple.js 2.1.6 和 d3.v3 任何帮助表示赞赏,谢谢。

这是目前为止的完整代码:

<!DOCTYPE html>

<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://dimplejs.org/dist/dimple.v2.1.6.min.js"></script>

</head>

<div id="chartContainer" style="height: 450px"></div>
<div id="chartContainer2" style="height: 450px"></div>  

 <script>


 var svg = dimple.newSvg("#chartContainer", "100%", "100%");
 var data =[
 { "Project":"one","Cost":3586900, "Ref":"AB-46" },
 { "Project":"two","Cost":1509270, "Ref":"AB-47" },
 { "Project":"three","Cost":1409250, "Ref":"AB-48" },
 { "Project":"four","Cost":1305270, "Ref":"AB-49" },
 { "Project":"five","Cost":1109270, "Ref":"AB-50" },
 { "Project":"six","Cost":1009270, "Ref":"AB-51" },
 { "Project":"seven","Cost":909270, "Ref":"AB-52" },
 { "Project":"eight","Cost":809270, "Ref":"AB-53" } ];

/*** get the total Cost ****/
var totalAmount = 0;
for(var i = 0; i < data.length; i++){
data[i].Cost = +data[i].Cost;
totalAmount += data[i].Cost;

if(i > 0){
   data[i]['CumulativeAmount'] = data[i].Cost + data[i-1].CumulativeAmount;
}else{
  data[i]['CumulativeAmount'] = data[i].Cost;
}
}


// calculate cumulative % from the cumulative amounts & total, round %
  for(var i = 0; i < data.length; i++){
  data[i]['CumulativePercentage'] = (data[i]['CumulativeAmount'] / totalAmount );
  data[i]['CumulativePercentage'] = parseFloat(data[i]['CumulativePercentage'].toFixed(2));
  }

var myChart= new dimple.chart(svg, data);
x = myChart.addCategoryAxis("x", "Ref");
//x.addOrderRule("x", "Ref");

y = myChart.addMeasureAxis("y", "Cost");
y2 = myChart.addMeasureAxis("y", "CumulativePercentage");
y2.tickFormat = "%";
y2.overrideMin = 0;
y2.overrideMax = 1;

var y3 = myChart.addPctAxis("y", "CumulativePercentage");   
y3.hidden = true;

s = myChart.addSeries(null, dimple.plot.bar, [x, y]);
s2 = myChart.addSeries(null, dimple.plot.line, [x, y2]);
s2.lineWeight = 3;                  

/***** get the value of the 80% of 'CumulativePercentage'   */
s3 = myChart.addSeries(null, dimple.plot.area, [x, y2]);

/**** make it invisible, to use custom d3 line later on *****/
s3.lineWeight = 0;

/****** get the 80% of cumulative percentages ****/
s3.data = [{
    "CumulativePercentage": 0.8
}]; 

myChart.draw(1500);

/***** draw a vertical line at 80% of calculated cumulative percentage line on top of the bars *****/

        svg.append("line")
           .attr("x1", x._scale(s3.data["CumulativePercentage"]))
           .attr("x2", x._scale(s3.data["CumulativePercentage"]))
           .attr("y1", myChart._yPixels())
           .attr("y2", myChart._yPixels() + myChart._heightPixels())
           .style("stroke", "red")
           .style("stroke-dasharray", "15")                                                                                                                             
 </script>
 </body>
 </html>

当我在 x 轴上添加一个排序规则时会发生这种情况,例如x.addOrderRule("Ref", true);

但我需要这样的图表:

关于如何执行此操作的任何想法?!提前感谢您的帮助和努力。

【问题讨论】:

    标签: javascript d3.js dimple.js


    【解决方案1】:

    我会直接添加 d3。比如:

    myChart.svg.selectAll(".dimple-bar").filter(function(d) {
      return d.y > 60
    }).style("fill", "red");
    

    myChart 是您的酒窝图表,d.y &gt; 60 是您的标准(y 是保存您的 y2 值的数据变量)。


    工作示例:

    <!DOCTYPE html>
    <html>
    
    <head>
      <script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
      <script src="http://dimplejs.org/dist/dimple.v2.2.0.min.js"></script>
    </head>
    
    <body>
    
      <div id="chartContainer"></div>
    
      <script type="text/javascript">
        var svg = dimple.newSvg("#chartContainer", 590, 400);
    
        var data = [{
          x: 'one',
          y: 10
        }, {
          x: 'two',
          y: 80
        }, {
          x: 'three',
          y: 70
        }, {
          x: 'four',
          y: 30
        }, {
          x: 'five',
          y: 20
        }, {
          x: 'six',
          y: 6
        }];
    
        var myChart = new dimple.chart(svg, data);
        myChart.setBounds(60, 30, 510, 305)
        var x = myChart.addCategoryAxis("x", "x");
        myChart.addMeasureAxis("y", "y");
        myChart.addSeries(null, dimple.plot.bar);
        myChart.draw();
    
    
        myChart.svg.selectAll(".dimple-bar").filter(function(d) {
          return d.y > 60
        }).style("fill", "red");
        
      </script>
    </body>
    
    </html>

    编辑

    我怀疑问题可能是您实际上没有任何数据绑定到第二个轴。因此,如果您想要相对于轴的条形值,您可以这样做:

    <!DOCTYPE html>
    <html>
    
    <head>
      <script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
      <script src="http://dimplejs.org/dist/dimple.v2.2.0.min.js"></script>
    </head>
    
    <body>
    
      <div id="chartContainer"></div>
    
      <script type="text/javascript">
        var svg = dimple.newSvg("#chartContainer", 590, 400);
    
        var data = [{
          x: 'one',
          y: 10,
          anotherY: 1
        }, {
          x: 'two',
          y: 80,
          anotherY: 2
        }, {
          x: 'three',
          y: 70,
          anotherY: 3
        }, {
          x: 'four',
          y: 30,
          anotherY: 4
        }, {
          x: 'five',
          y: 20,
          anotherY: 5
        }, {
          x: 'six',
          y: 6,
          anotherY: 6
        }];
    
        var myChart = new dimple.chart(svg, data);
        myChart.setBounds(60, 30, 510, 305)
        var x = myChart.addCategoryAxis("x", "x");
        var y = myChart.addMeasureAxis("y", "y");
        var anotherY = myChart.addMeasureAxis("y", "anotherY");
        myChart.addSeries(null, dimple.plot.bar);
        myChart.draw();
    
        console.log(myChart);
    
        myChart.svg.selectAll(".dimple-bar").filter(function(d) {
          var val_of_bar_on_other_scale = anotherY._scale.invert(y._scale(d.y));
          return val_of_bar_on_other_scale > 2
        }).style("fill", "red");
        
      </script>
      
    </body>
    
    </html>

    【讨论】:

    • 感谢您的回复。看起来不错,但是,我已经更新了问题(我真的应该先这样做,但是..),我有 2 个 Y 轴,一个用于 000' 中的数字,一个用于百分比。您的解决方案完全适用于数字,不适用于第二个 Y 轴 (%)。所以如果我尝试这个:myChart.svg.selectAll(".dimple-bar").filter(function(d) { return d.y2 &gt; 60 }).style("fill", "red"); 它什么也做不了。现在很困惑,为什么它适用于 tyhe 数字,而不适用于 % 轴......有什么想法吗?谢谢
    • @user3891065,现在不在计算机附近,但通过 console.log 或该过滤器函数中的断点检查 d 变量。您的第二个 y 轴变量将是它的一个属性。
    • 确实在 console.log 中检查过,它显示这个变量 (dy) 包含第一个 Y(k's) 轴值,但不是第二个 Y (%) ...和第二个 Y轴是未定义的,当我运行该函数时..所以,现在更加困惑..哈哈
    • 非常感谢,很有魅力!!!实际上,该值绑定到 y2 (我正在计算它,累积百分比),但由于某些原因,您的第一个建议没有得到它。但是当我尝试你的更新功能时,它就成功了!非常感谢马克,将您的答案标记为正确答案。干杯!
    • 对不起,马克,也许你也可以帮我解决这个问题,如果我想改变那些超过 80% 但不是基于 Y2 轴值,而是基于计算累积百分比线(在我的情况下为 s3 系列)。我会计算它并画一条线(例如帕累托图)。您可以在屏幕截图中看到,前 3 个条形图低于这 80%,因此我想突出显示它们。抱歉造成误解,您的回答完全解决了我的问题,但看起来我对这张图表感到困惑......您对我如何做到这一点有任何想法,或者有什么可能吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多