【问题标题】:How do I stack an array variable and plot three of these stacked array variables on a barh?如何堆叠一个数组变量并将其中三个堆叠的数组变量绘制在一个 barh 上?
【发布时间】:2020-04-09 04:56:33
【问题描述】:
% S
a1 = [2015/07/23 2015/11/25 2016/01/20];
b1 = [2011/06/22 2014/10/14 2015/03/01];
c1 = [2012/04/16 2013/06/23 2015/04/08];
d1 = [2013/09/15 2014/01/19 2016/09/13];
e1 = [2015/04/01 2016/04/04 2018/08/04];

% H
a2 = [2012/07/23 2015/06/25 2016/05/20];
b2 = [2009/06/22 2014/09/14 2015/11/01];
c2 = [2006/04/16 2013/12/23 2015/06/08];
d2 = [2008/09/15 2014/05/19 2016/02/13];
e2 = [2011/04/01 2016/05/04 2018/03/04];

% HS
a3 = [2009/07/23 2010/06/25 2018/02/20];
b3 = [2011/06/22 2014/07/14 2016/09/01];
c3 = [2013/04/16 2016/09/23 2019/05/08];
d3 = [2013/09/15 2018/05/19 2019/06/13];
e3 = [2014/04/01 2019/01/04 2019/12/04];

% T
t = [1 2 3 4 5];

dates = [a1 a2 a3; b1 b2 b3; c1 c2 c3; d1 d2 d3; e1 e2 e3];

% Plotted
figure
barh(t, dates, 'hist')

title('Script')
xlabel('Time')
ylabel('Tail')
legend({'S','H','HS'})
legend('Location', 'southoutside')
legend('Orientation','horizontal')

如果您绘制此图,您会注意到有 9 个条形图与每个“t”相关联。每个 t 的“日期”变量中应该只有三个。如何分别堆叠 'a1,a2,a3, 然后 b1,b2,b3 ...... 和 e1,e2,e3' 来完成这个壮举?

我的脚本结果:

我希望输出的样子

Note: 1. The y axis contains the 5 different elements 't'
      2. The x axis should contain the date elements 'dates'
      3. When you plot these values, there are 9 bars. There should be three per 
      't'.
      4. On the x axis, I would like to have the dates represented.
      5. I would like to eventually be able to create a user prompted system that 
      allows people to enter in dates for a corresponding array, and have that 
      date be stacked onto the chart.

以下代码完成了我的要求,但条形垂直而不是水平堆叠,并且还接受不同的用户输入。

https://www.mathworks.com/matlabcentral/fileexchange/32884-plot-groups-of-stacked-bars

【问题讨论】:

  • 我很确定你想绘制dates 而不是d(否则你会报错,你的大部分代码都不会被使用)
  • 代码中的“堆叠”让我很恼火。为什么要介绍a,b,c,d,e?在dates 中,您每行连接3 个数组(每个数组由3 个元素组成,这使得dates 成为一个3x3=9 列矩阵),但您只想看到3 个柱?也许你可以澄清你想要什么以及你的代码应该如何工作
  • 对于 t=1,您期望 3 个柱。他们应该有什么长度?我在您的数据中看到总共 9 个数字。
  • 您发布的代码在这种形式下确实没有多大意义。一半以上的变量没用!
  • 您好,先生。对 Q1 的回应:是的,d=dates,请见谅。

标签: matlab


【解决方案1】:

您非常接近解决方案。从 MATLAB 文件交换中下载该文件,打开它,将 bar 替换为 barh,您就得到了自己的水平堆叠条形图。

您的输入不符合预期的格式,该函数需要一个 3d 矩阵。对您的代码稍作改动:

dates = [cat(3,a1,a2,a3);cat(3,b1,b2,b3); cat(3,c1,c2,c3); cat(3,d1,d2,d3); cat(3,e1,e2,e3)];
plotBarHStackGroups(dates,t)

【讨论】:

  • 交换文件的问题不是我无法让条形水平显示,而是我做到了。问题是文件需要的输入是数据和条形图的标签。这不是我想要的。我的脚本将始终有 5 个尾部和每个尾部 3 个属性。日期将是变化的变量。我确信我可以弄清楚如何将一个填充了以前日期的 excel 文件链接到脚本,但是让脚本以我想要的方式安排日期 - 这就是我遇到问题的地方。我希望 Matlab 认识到这三个属性是
  • 随着时间的推移而变化,因此,条形应该相互堆叠。
  • 您写了“以下代码完成了我的要求,但条形垂直而不是水平堆叠”,现在您写道“交换文件的问题不是我无法让横条水平显示,我做到了。”。我真的很难理解你的要求。我以为我在回答你的问题。
  • 对,它“有点作用”,因为对于具有三个属性的特定元素,它能够对与每个属性对应的值进行分组并堆叠这些属性。这就是我试图在我的代码中做的没有成功的事情。希望这是有道理的?
  • 请查看更新后的问题。它包含我希望数据看起来像的图片。另请注意,日期不是静态的。创建此脚本的目的是为了在未来多次使用,因此理想情况下日期应该在动态数组中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2023-03-30
  • 2014-10-22
相关资源
最近更新 更多