【问题标题】:stacked column chart for two data sets - Excel两个数据集的堆积柱形图 - Excel
【发布时间】:2018-07-11 13:54:42
【问题描述】:

我是新来的,虽然我之前已经浏览过好几次博客了。

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

环顾四周,我发现在使用 Google Charts 时,同样的问题得到了肯定的回答(这里是线程 stacked column chart for two data sets - Google Charts

基本上,我有两张关于 2 个国家/地区的表格,其中包含不同年份的月度数据。示例:

我想要的输出是在横轴上显示年份,并在堆积列中表示一个国家,该堆积列将每月数据堆积在另一个国家列的 侧面(如图表使用谷歌图表制作,如the thread linked above 中所述。

解决方案应该是该示例:

我没有找到该问题的答案,您能提供一些帮助吗?

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

非常感谢大家

【问题讨论】:

  • 你能去掉 [vba] 和 [excel-vba] 标签直到你有一些代码吗?它们是程序员的标签,用于帮助人们处理不太有效的代码。我没有投反对票,但这些域中的其他用户可能不会那么宽容。
  • 感谢马克的提示!我首先添加它们是因为我认为制作这样的东西需要 VBA 代码。
  • 如果您有 Excel 2013 或更新版本,您可以使用 PowerPivot 链接这两个表,然后绘制图表。自己没试过。
  • 使用数据透视表也可以,感谢您的建议!出于其他目的,我会记住这一点。唯一的缺陷是我无法格式化每个国家/地区每个月的颜色,例如,我正在寻找的最终产品是所有国家 A 列都是纯蓝色的。这听起来可能很奇怪,但最终目标是制作一张图表来比较每年的同一时期。

标签: excel charts


【解决方案1】:

只需使用普通的堆叠条形图,如果您想对堆叠进行分组,请在表格中保留空白列:

通过一些格式化,您几乎可以得到您所拥有的。唯一具有挑战性的部分是将年份标签作为第二个水平轴。为此,我刚刚创建了另一个系列全 0,其中年份为标签,并将其添加为辅助轴(也添加辅助水平轴),然后在辅助垂直轴上选择让它“穿过轴”值 0。稍加格式化后,您就可以得到您想要的:

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

【讨论】:

  • 感谢 Dan,这是一个简单的解决方法!事实上,对于标签问题,只需选择两行(国家和年份),图表将反映 2 个级别。
  • @Ema,更简单。如果这解决了您的问题,请不要忘记标记为正确。
  • 谢谢,非常感谢和简单的解决方案,尽管需要一些格式才能为每个国家/地区设置颜色。附:如果标签由年份+国家名称组成,则无需在年份之间添加空白列。
  • 您可能会发现我的Clustered and Stacked Column and Bar Charts 教程很有用。它显示了您需要的数据布局,并解释了如何获得很好的居中标签(此答案末尾屏幕截图中字母下方的年份)。
【解决方案2】:

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

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

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

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

如您所见,为了制作这个示例,我使用了带有嵌入式电子表格的在线编辑器。我在其中输入我的数据,然后使用 JSON 文件使用我的代码访问它,它是 Settings 下的 short 文件:

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

在我访问我的数据后,我将其存储在局部变量中,您可以在 script.js 文件中看到它。我写了一些 cmets,所以你知道哪个变量是什么。我用$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(非常类似于 google 图表),它有一个很好的 documentation 和很多 examples

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

 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 中设置不同的值来区分这两个国家/地区。这个变量允许我创建一个堆叠条形图,其中包含多个具有相同轴标签的条形图。

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

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

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

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

我希望这会有所帮助,如果我的解释不清楚,请随时发表评论:)

披露:我是 Funfun 的开发者。

【讨论】:

  • 尼古拉斯太棒了!不幸的是,我的编码能力总体上接近于 0...
  • 别担心,它可能会帮助其他有同样问题的人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多