【问题标题】:Bar chart with Stacked bar带有堆积条的条形图
【发布时间】:2016-02-17 16:24:16
【问题描述】:

尊敬的 Highcharts 专家,

我对 highchart 非常陌生,并且正在慢慢上升。我想创建一个与普通条形图和堆叠条相结合的高图。我在制作时遇到问题。 下面是我的 jsfiddle 版本

http://jsfiddle.net/wt45e6mL/9/

plotOptions: {
series: {
            cursor: 'pointer',
            pointPadding: 0,
        groupPadding: 0.01,
            point: {
                events: {
                    click: function () {
                    if(this.category=='60') return false;
                        alert('Category: ' + this.category + ', value: ' + this.y);
                        selected = this;
                    }, 

                }
            },

            allowPointSelect: true,
            states: {
                select: {
                    color: null,
                    borderWidth: 10,
                    borderColor: 'Blue'
                }
            }
        },
  column: {
    stacking: 'normal',
    dataLabels: {
      enabled: false,
      color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white',
      style: {
        textShadow: '0 0 3px black'
      }
    }
  },

}

以下是我的难点:

1) 在这里,对于 60、61、62,我想提供不同的数据(系列)来创建一个普通条和休息堆栈条。如果数据不存在,则不要创建它。所以堆栈栏应该从一个来自另一个来源的值开始,在那个普通栏之前

2) 我想要一个我能够执行的 onclick 事件,但这个事件是在系列数据上调用的。单击时,我想突出显示整个堆栈栏以及 x 轴值。前三个不应该被选中。

3) 我想再提供一个数据(系列),它将显示一条直线并突出显示其 y 轴值。

在上述几点上需要一些帮助。 谢谢。

【问题讨论】:

  • 我不是 100% 清楚你在问什么。将您的 3 个问题分开可能会更好。但是,您是否试图在视觉上实现这样的目标:jsfiddle.net/wt45e6mL/12
  • 建议 1) 我想从最小任意值开始 x 轴。因此,假设 60、61、62 的数据不可用图表应该从 63 开始。我可以通过将最小值传递给 x 轴并将 John 的数据传递为 null 来实现这一点。这是正确的实现吗 2)我已经删除了堆栈分组并为系列提供了点填充和组填充。这个可以吗 ? jsfiddle.net/wt45e6mL/15
  • 你好,芭芭拉,谢谢,是这样的。您的反馈和示例很有用。我已经根据您的输入更新了我的小提琴。最后的一些查询 1) 我只想在 x 轴上选择大于 62 的值的栏,这是实现的,但我希望 x 轴值也突出显示。 2)对我来说最棘手的。我想通过单独的系列将 B & C 的数据显示为一种颜色和一个图例。 3)情节线(红色)应具有突出显示的y轴值jsfiddle.net/wt45e6mL/25

标签: highcharts


【解决方案1】:

在这一个问题中,您有很多荒谬的问题。将来将它们分开,这样更容易回答,并且使问题对未来的读者更有用。但是,让我看看我是否可以提供帮助: 1) 您可以对不想重叠的系列使用 null 或使用 x 和 y 坐标

series: [{
  name: 'A',
  //stack: 1,
  data: [{x:60, y:4000}, {x:61, y:4000}, {x:62, y:4000}, {x:63, y:4000}]
}, {
  name: 'B',
  id: 'B',
  color: 'red',
  //stack: 2,
   data: [{x:63, y:1000}, {x:64, y:1000}, {x:65, y:1000}, {x:66, y:1000}, {x:67, y:1000}, {x:68, y:1000}, {x:69, y:1000}, {x:70, y:1000}]
}, {
  name: 'C',
  linkedTo:'B',
  color: 'red',
  //stack: 2,
   data: [{x:66, y:400}, {x:67, y:400}, {x:68, y:400}, {x:69, y:400}, {x:70, y:400}, {x:71, y:400}, {x:72, y:400}, {x:73, y:400}, {x:74, y:400}]
},{
  name: 'D',
  //stack: 2,
   data: [{x:63, y:400}, {x:64, y:600}, {x:65, y:700}, {x:66, y:800}, {x:67, y:1100}, {x:68, y:1100}, {x:69, y:1100}, {x:70, y:1100}, {x:71, y:1100}, {x:72, y:1100}, {x:73, y:1100}, {x:74, y:1100}]

}, {
  name: 'E',
  //stack: 2,
  data: [{x:64, y:400}, {x:65, y:400},{x:66, y:400},{x:67, y:400}, {x:68, y:400}, {x:69, y:400}, {x:70, y:400}, {x:71, y:400}, {x:72, y:400}, {x:73, y:400}, {x:74, y:400}]

}]

2)您似乎已经弄清楚了点击事件。请注意,您可以覆盖每个系列的点击事件,因此对于您不希望有事件的系列,只需将点击事件添加到不执行任何操作的系列:

series: [{
  name: 'A',
  events: {
    click: function() {
        return true;
    }
  },

3) 您要查找的线是 y 轴绘图线

yAxis: {
  labels: {
    formatter: function() {
      return '\u20ac' + ' ' + this.value
    },
    x: -20,
    y: 0
  },

  plotLines: [{
    value: 1000,
    color: 'red',
    width: 3,
    zIndex: 10,
    id: 'plot-line-1'
  }],

4 - 来自 cmets)将 2 个系列显示为一种颜色和一个图例项目。您可以手动设置每个系列的颜色。使用它将它们都设置为相同的颜色。要仅在图例中显示一个,请使用 linkedTo

, {
  name: 'B',
  id: 'B',
  color: 'red',
  //stack: 2,
   data: [{x:63, y:1000}, {x:64, y:1000}, {x:65, y:1000}, {x:66, y:1000}, {x:67, y:1000}, {x:68, y:1000}, {x:69, y:1000}, {x:70, y:1000}]
}, {
  name: 'C',
  linkedTo:'B',
  color: 'red',
  //stack: 2,
   data: [{x:66, y:400}, {x:67, y:400}, {x:68, y:400}, {x:69, y:400}, {x:70, y:400}, {x:71, y:400}, {x:72, y:400}, {x:73, y:400}, {x:74, y:400}]
}

5 - 也来自 cmets) 突出显示轴上的值。您可以使用格式化程序功能来修改轴上的标签

yAxis: {
  labels: {
    useHTML: true,
    formatter: function() {
        if (this.value == 1000) return '<span class="highlight">' + '\u20ac' + ' ' + this.value + '</span>'
      return '\u20ac' + ' ' + this.value
    },
    x: -20,
    y: 0
  },

http://jsfiddle.net/wt45e6mL/31/

【讨论】:

  • 谢谢。这解决了我的问题。我会记住问题分离。
【解决方案2】:

1) 这是一个复杂的问题,没有简单的解决方案。您可以将堆叠列的分组参数设置为 false:

bar.grouping

如果您想为列使用三个单独的堆栈而不是为列使用一个堆栈,则可以使用 series.stack:

stack

您可以将 groupPadding 和 pointPadding 设置为 0 并将您的 series.grouping 设置为 false。它应该对您的图表有所帮助。

groupPadding

pointPadding

grouping

在这里你可以看到它是如何工作的例子:

http://jsfiddle.net/y6tLaz1a/3/

2) 在您的点击事件回调函数中,您可以检查点类别是否小于 63。如果它更小,您可以像现在一样返回 false。在其他情况下,您可以遍历所有点并检查它们的类别是否等于您刚刚单击的点的类别。如果它们具有相同的类别,您可以使用 Point.select 选择它们。在这里您可以阅读有关此方法的信息:

Point.select

例如,您的点击事件回调函数可能如下所示:

  click: function() {
  var point = this;
  if (point.category <= 63) {
    return false;
  }
  point.select(true, false)
  Highcharts.each(this.series.chart.series, function(series, ind) {
    Highcharts.each(series.data, function(p, i) {
      if (p.category == point.category) {
        p.select(true, true)
      }
    })
  })
 },

您可以在此处查看此功能的示例:

http://jsfiddle.net/wt45e6mL/22/

3) 您可以在您的情况下使用 plotLine: addPlotLine

您可以使用 label.text 参数将文本添加到您的 plotLine: label.text

这里你可以看到一个例子: http://jsfiddle.net/eyLz09xv/

因此将所有三个示例合二为一,您可以在此处看到最终结果: http://jsfiddle.net/y6tLaz1a/4/

highcharts 论坛上的相关话题: http://forum.highcharts.com/highcharts-usage/bar-chart-with-stacked-bar-t34981/

亲切的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2017-06-05
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2017-10-14
    相关资源
    最近更新 更多