【问题标题】:Matlab `bar`: Control spacing between bar groupsMatlab`bar`:控制条组之间的间距
【发布时间】:2018-10-29 08:52:39
【问题描述】:

以下创建条对:

x = rand(10,2);
hBar = bar(x)

每对之间有很多空间。我怎样才能减少对之间的间距(不是每对中的条之间)?

get(h(1)) 没有透露任何可能更改的属性。属性BarWidth 仅控制每对中的条之间的间距。

属性编辑器也不会显示可能的候选人。

我正在使用 Matlab 2015b。

后记:bar 指定一个宽的width 参数会扩大每个条形而不改变它们相对于彼此的位置,因此肯定会缩小条形组之间的差距。但是,它也会导致每个组内的条重叠。

【问题讨论】:

  • Per the documentation: bar(x,y)x 指定的位置绘制条形图,而不是在y 中的整数索引处。
  • 我试过hBar = bar(0.5*(1:10),x),是的,x 轴的缩放比例发生了变化,但是与组间空间相比,条形的相对宽度似乎没有变化。

标签: matlab bar-chart


【解决方案1】:

在 MATLAB R2017a 中,bar(...,'hist') 使用旧式条形图,不使用 Bar 图形对象,而是使用更底层的 Patch 图形对象。 (我指定了版本号,因为这不是文档中提到的内容,因此新版本可能会有所不同。)

我能够修改这些Patch 对象的顶点位置以移动条形,增加组内的空间并减少组间的空间。默认情况下,组内的条使用'hist' 选项进行接触。

x = rand(10,2);
hBar = bar(x,'hist');

v = hBar(1).Vertices;
v(:,1) = v(:,1) - 0.1; % shift x locations left
hBar(1).Vertices = v;

v = hBar(2).Vertices;
v(:,1) = v(:,1) + 0.1; % shift x locations right
hBar(2).Vertices = v;

修改上面的代码以进行更精细的条形放置应该相对容易。请注意,每个条使用 5 个顶点。在 2 个柱的情况下,左侧的右侧具有舍入值,右侧具有左侧的舍入值。您可以通过mod(v(:,1),1)==1 识别这些值。但对于更多的酒吧,这将不成立。也许单独调整值v(ii:5:end,1),对于 ii 从 1 到 5,将是最简单的方法。

【讨论】:

  • 谢谢,克里斯。对于 2 系列的示例,我认为这将在紧要关头完成。还需要调整补丁的 x 坐标以加宽它们,以便它们邻接。正是基台使每个组的成员身份显而易见,从而可以缩小组之间的间距。
  • 我注意到Width 参数被归一化为在bar 函数中确定的某个值。对于每组超过 2 个条形,调整顶点和宽度的概括需要重新编码。编写自己的基于补丁的bar 函数可能更容易。我认为对于广义的情况,一般的方法将是实际的答案。
  • 顺便说一句,我不确定如何处理解决该示例的答案,但对于一般情况而言可能过于繁琐。将其标记为答案是否符合 Stack Exchange 的精神?如果您可以为一般情况添加有关该方法的评论,我想将您的方法标记为答案(除非您看到一种巧妙的方式来避免需要从头开始编写基于自定义补丁的bar)。
  • @user36800:如果它解决了你的问题,我猜你会接受这个答案,如果它有帮助就点赞。由你来解释这对你意味着什么。 — 我不知道创建自己的补丁是否比修改现有补丁更多或更少。也可以试试rectangle函数,可能更简单。
  • 我会赞成的。很有见地。然而,对我来说,一个完整的答案将包括提及可能从头开始编写绘图函数背后的考虑因素,并提及您的 rectangle 函数。我认为这会相对简单地提及,但话又说回来,它们是我的意见。
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多