【问题标题】:How to draw a different gradient fill for negative values?如何为负值绘制不同的渐变填充?
【发布时间】:2019-11-02 23:27:35
【问题描述】:

如何在正负区域同时获得渐变填充,而不仅仅是纯色?

  • 正区域渐变应为蓝色
  • 负区域渐变应为红色
  • 渐变色在 Y 轴附近应为黑色/透明(值 0)

目标: https://codepen.io/francoisG/pen/gOOoEjQ

为了实现这个目标,我不得不硬编码第二个渐变停止点:

  • 正梯度:第二个停止强制为 0.67
  • 负梯度:第二个停止强制为 0.33

显然,这两个值不应该是硬编码的,那么无论数据如何,我如何实时计算这两个值? 每个值都应该是渐变部分相对于系列总范围的百分比。

  • 对于正梯度:(Ymax - 0) / (Ymax - Ymin),在本例中为 12 / 12 + 6 = 12/18 = 0.67
  • 对于负梯度:(0 - Ymin) / (Ymax - Ymin),在这个 案例 6 / 12 + 6 = 6/18 = 0.33

我的问题是我不知道在图表代码中计算这些数据。我用 Ymin 和 Ymax 尝试了很多东西,但没有成功。 感谢您的帮助

series: [{
  name: 'John',
  data: [3, 4, -6, 5, 4, 10, 12],
  fillColor: {
    linearGradient: {x1: 0, y1: 0, x2: 0, y2: 1},
    stops: [
      [0, Highcharts.getOptions().colors[0]],
      [0.67, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
    ]
  },
  zones: [{
    value: 0,
    color: '#D76363',
    fillColor: {
      linearGradient: {x1: 0, y1: 1, x2: 0, y2: 0},
      stops: [
        [0, 'rgba(215,99,99,0.5)'],
        [0.33, 'rgba(2,0,0,0)']
      ],
    }
  }]

【问题讨论】:

  • 不确定是什么问题?当我检查你的笔时,它的正极是蓝色的,负极是红色的,一直向上/向下到零?
  • 感谢帮助我。是的,填充颜色是正确的,但我希望它们采用线性渐变样式。渐变细节在我的第一篇文章中给出。有什么想法吗?
  • 我编辑了我的第一篇文章,并附上了目标示例。谁有解决办法?

标签: javascript highcharts linear-gradients


【解决方案1】:

您可以使用chart.events.load 回调函数和update() 方法来设置这些计算值。检查下面发布的演示和代码:

chart: {
  renderTo: 'container',
  type: 'areaspline',
  events: {
    load: function() {
      const chart = this;
      const yAxis = chart.yAxis[0];

      let posGrad = (yAxis.max - 0) / (yAxis.max - yAxis.min);
      let negGrad = (0 - yAxis.min) / (yAxis.max - yAxis.min);

      chart.series[0].update({
        fillColor: {
          linearGradient: {
            x1: 0,
            y1: 0,
            x2: 0,
            y2: 1
          },
          stops: [
            [0, Highcharts.getOptions().colors[0]],
            [posGrad, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
          ]
        },
        zones: [{
          value: 0,
          color: '#D76363',
          fillColor: {
            linearGradient: {
              x1: 0,
              y1: 1,
              x2: 0,
              y2: 0
            },
            stops: [
              [0, 'rgba(215,99,99,0.5)'],
              [negGrad, 'rgba(2,0,0,0)']
            ],
          }
        }]
      });
    }
  }
}

演示:

API 参考:

【讨论】:

  • 第一次运行图表时它工作正常,但如果我用类似 var newData = [12, 4, 10, 2, 4, 100, 12]; 的东西更新数据chartarea.series[0].setData(newData);渐变没有更新。
  • 我已经编辑了演示。可以使用render 事件而不是load 来实现:jsfiddle.net/BlackLabel/9wey1z4q
【解决方案2】:

您应该同时使用fillColornegativeFillColor 并配置线性渐变样式。我在这里修改了你的代码:https://codepen.io/tredex/pen/yLLprxz

negativeFillColor: {
    linearGradient: {x1: 0, y1: 1, x2: 0, y2: 0},
    stops: [
      [0, '#D76363'],
      [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
    ]
},

fillColor: {
  linearGradient: {x1: 0, y1: 0, x2: 0, y2: 1},
  stops: [
    [0, Highcharts.getOptions().colors[0]],
    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
  ]
}

【讨论】:

  • 请将相关代码从 Codepen 移至 SO 以便存档。
  • 感谢您的提示。那也是我去过的地方。但是我没有看到正负梯度在 X 轴 (y=0) 处变得非常暗(透明)。这段代码的问题是梯度是为整个形状计算的。正梯度应该从 0 开始到 Ymax 值。负梯度应该从 0 开始到 Ymin 值
  • 对于负梯度,我认为我们应该用百分比(0 - Ymin)/(Ymax - Ymin)替换第二站的1,例如0.4,对正梯度做同样的事情.但我不知道如何计算...请帮助
  • 我编辑了我的第一篇文章,并附上了目标示例。谁有解决办法?
  • 您可以在创建图表之前定义数据吗?例如,在开头定义var mData=[3, 4, -6, 5, 4, 10, 12],然后定义像data: mData 这样的数据。如果是这种情况,那么您可以先计算数据数组的最小值和最大值,然后使用它而不是硬编码部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多