两个数据集的堆积柱形图 - Excel

时间:2018-02-01 09:31:16

标签: excel charts

我是新来的,虽然我以前曾多次浏览博客。

我想知道是否有某种方式(如果需要也使用VBA)来创建在MS Excel 2016中显示两个不同数据集的堆积柱形图。

环顾四周,我看到同样的问题在使用谷歌图表时得到了肯定的答案(这里是主题stacked column chart for two data sets - Google Charts

基本上,我有两个表格,每个国家/地区有两个不同年份的月度数据。样品:

Excel sheet sample

我想要的输出是在水平轴上显示年份,并且在一个堆叠列中显示一个国家/地区,其中堆积了另一个国家/地区列的的月度数据(如图表所示)使用Google图表制作,如the thread linked above

中所述

解决方案应该看样本:

wanted solution

我没有找到这个问题的答案,请你提供一些帮助吗?

请注意我在VBA中有非常基本的技能,即我在阅读时可以或多或少地理解代码,但我自己无法编写代码。

非常感谢大家

2 个答案:

答案 0 :(得分:1)

我看到你链接了一个stackoverflow问题,他们使用javascript来创建一个带有谷歌图表的图表。我认为这种语言是创建像你这样的复杂图表的最佳方式。

你提到你的编码技巧在vba中并不好,我不知道javascript是否相同,但我会尽力描述我的代码。

以下是我为您编写的工作代码:

https://www.funfun.io/1/#/edit/5a73067991f44418b7b84218

您可能已经看到,为了制作此示例,我使用了带有嵌入电子表格的在线编辑器。我在其中输入数据并使用JSON文件使用我的代码访问它,它是设置下面的short文件:

{
    "data": "=A1:D27"
}

在我获得对数据的访问权限后,我将其存储在本地变量中,您可以在script.js文件中看到它。我写了一些评论,所以你知道哪个变量是什么。我用$internal.data抛出我的数据,这是电子表格中的数据从A列存储到D,第1行到第27行:

for (var i = 0; i < $internal.data.length; i++) // $internal.data.length = 27 in this example
{
  if (i == 0 || i == 14) {
    country.push($internal.data[i][0]);
    continue;
  }
  if (i > 0 && i < 13) {
    months.push($internal.data[i][0]); // months
    dataA.push(
      [
        parseInt($internal.data[i][1]), // value 2015 countryA
        parseInt($internal.data[i][2]), // value 2016 countryA
        parseInt($internal.data[i][3]) // value 2017 countryA
      ]);
  }
  if (i > 13 && i < 27) {
    dataB.push(
      [
        parseInt($internal.data[i][1]), // value 2015 countryB
        parseInt($internal.data[i][2]), // value 2016 countryB
        parseInt($internal.data[i][3])  // value 2017 countryB
      ]);
  }
}

正确存储数据后,我可以使用javascript库创建我的图表,我使用的是Highcharts(非常类似于谷歌图表),它有一个很好的documentation,有很多examples

我将所有数据和一些选项放在一个使用highcharts格式的系列变量中,如下所示:

 var series = [];
  // We enter the data we need in series
  for(var i = 0; i < months.length; i++) {
    series.push({
        name: months[i] + " " + country[0],
        type: 'column',
        color: Highcharts.getOptions().colors[i+7],
        data: dataA[i],
        stack: country[0] // country A
    });
    series.push({
        name: months[i] + " " + country[1],
        type: 'column',
        color: Highcharts.getOptions().colors[i+7],
        data: dataB[i],
      stack: country[1] //country B
    });        
  }

...
// we enter series in the highchart chart
    series: series

我通过在stack中添加不同的值来区分这两个国家/地区。此变量允许我创建一个堆叠条形图,其中多个条形图具有相同的轴标签。

完成此操作后,您将获得如下图表:

all labels

如果您不想显示所有月份,您可以点击您不想要的月份标签,它会消失,如下所示:

few labels

构建图表后,可以使用excel add-in called Funfun将其加载到Excel中。您只需将加载项中的在线编辑器的URL粘贴即可。以下是我的示例:

final

然后,您可以点击图表的右上角以不同的格式保存图表:

save chart

我希望这有帮助,如果我在我的解释中不清楚,请毫不犹豫地发表评论:)

披露:我是Funfun的开发者。

答案 1 :(得分:1)

只需使用普通的堆积条形图,如果要对堆栈进行分组,则在表格中留下空白列:

enter image description here

通过一些格式化,您可以获得几乎所有的格式。唯一可能具有挑战性的部分是将年份标签作为次要水平轴。为了做到这一点,我刚刚创建了另一个全0系列,其中年份为标签,并将其添加为辅助轴(也在辅助水平轴中添加),然后在辅助垂直轴上选择让它“穿过”轴&#39;值为0.经过一番格式化后,您可以得到您想要的内容:

enter image description here

不需要VBA,当然也不需要JavaScript!