我正在尝试实现一个 DateListBarChart 函数,该函数获取日期数据并输出与 DateListPlot 具有相同位置的条形图。如果给定相同的数据,它们必须在相同的水平位置绘制数据,因此可以使用 Show 组合它们。我发现很难正确设置 BarSpacing 以便图的水平范围不会改变,并且条形基本保持在相同的位置。

我一直无法推断出正确的缩放比例,因此 BarSpacing->{0.2,0.3} 导致该组条形可用的 x 轴长度的 20% 被该组中的条形之间的间距占用,而 30% 作为条形组之间的间距。出于技术原因,我通过将东西传递给 RectangleChart 来做到这一点。根据文档, BarSpacing 被视为 RectangleChart 中的绝对单位。显然,如果有更多系列,间隙的绝对尺寸需要更小,并且条形需要更窄。

一些例子:

arList = FoldList[0.9 #1 + #2 &, 0.01, RandomReal[NormalDistribution[0, 1], 24]]

{0.01, 0.334557, 2.02709, 1.1878, 1.9009, 3.08604, 2.36652, 3.04111,
3.32364, 3.22662, 3.12626, 2.59118, 1.69334, 1.21069, 0.23171,
0.689415, -0.852649, -0.124624, 0.58604, -0.481886, 0.221074,
-0.300329, 2.36137, 0.427789, -1.47747}

dists = RandomChoice[{3, 4}, Length[arList]]
{4, 4, 4, 3, 4, 3, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 3, 4, 3, 3, 3, 3, 3}

结果是:
RectangleChart[Transpose[{dists - 0 - 0/2, arList}],
 PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None],
 Frame -> True, GridLines -> Automatic, BarSpacing -> {0, 0}]
RectangleChart[Transpose[{dists - 0.7 - 0.5/2, arList}],
 PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None],
 Frame -> True, GridLines -> Automatic, BarSpacing -> {0.7, 0.5}]

请注意,数据沿 x 轴的距离与前一个示例不同。

尝试绘制多个系列的图表时会变得更加困惑(在本例中也是如此,以供说明)。
RectangleChart[
 Transpose[{{dists - i/2 - j/2, arList}, {dists - i/2 - j/2,
  arList}}, {2, 3, 1}], PlotRange -> {{0, 180}, {-2, 4}},
 ChartStyle -> EdgeForm[None], Frame -> True, Ticks -> None,
  GridLines -> Automatic, BarSpacing -> {i, j}]

我多年来一直在努力寻找正确的公式,以便自定义函数的 BarSpacing 设置(此处未看到)产生正确的间距和条宽,以便水平绘图范围不会像 BarSpacing 那样改变。

我错过了什么?

编辑:为了回应贝利撒留,这是我要去哪里的一个例子。它有效,有点(条形与线不太对齐,但这可能是我使用的日期)但是堆叠条形的情况无法与条形一起绘制在它们应该在的位置,就像任何类型的条形图本身有多个系列。 (我为日期标签放置算法感到非常自豪:正在发挥作用的功能并不想放弃这种外观。)

这是一个不起作用的。数据应填充水平范围。 (不同的宽度条是故意的 - 它是年度和季度数据的组合。)

编辑 2

我记得为什么我没有在 Filling 中使用 DateListPlot 来绘制条形,就像 Mike Honeychurch 的包中那样 - 如果你有除非常细的条形之外的任何东西,它们最终会将顶部边缘放在错误的位置。
DateListPlot[{dateARList},
 PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0},
 FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}},
 PlotRange -> All]

最佳答案

也许使用 ChartElementFunction 选项而不是 BarSpacing 有帮助。例如,代码中的 barplot 将绘制一个条形图,这样每个条形的左侧边距为 gapl,右侧边距为 gapr,其中 gaplgapr 是条形总宽度的分数

scale[{{xmin_, xmax_}, {ymin_, ymax_}}, {gapl_, gapr_}] :=
 {{xmin (1 - gapl) + xmax gapl, ymin}, {xmax (1 - gapr) + xmin gapr, ymax}}

barplot[dists_, arList_, {gapl_, gapr_}, opts___] :=
 RectangleChart[Transpose[{dists, arList }], opts,
  Frame -> True,
  GridLines -> Automatic, BarSpacing -> 0,
  ChartElementFunction -> (Rectangle @@ scale[#, {gapl, gapr}] &)]

用法:

绘制没有间隙的原始条形图
barplot[dists, arList, {0, 0}]

这将绘制一个两侧边距为 0.2 的条形图,导致条形图的间隙为条形总宽度的 0.4 倍。请注意,条形的位置与第一张图中的位置相匹配。
barplot[dists, arList, {0.2, 0.2}]

您可以通过执行类似的操作来绘制多个系列
Show[barplot[dists, arList 0.9, {0, 0.5}],
 barplot[dists, arList 0.8, {0.5, 0}, ChartStyle -> LightGreen]]

关于wolfram-mathematica - BarSpacing 选项是如何在 Mathematica 中真正实现的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7293317/

10-12 18:27