我正在尝试实现一个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
does.
我缺少什么?
编辑:为了回应贝利撒留,这是我要去的地方的一个例子。它可以工作,有点(条形与线不太对齐,但这可能是我正在使用的日期),但是带有堆叠条形的情况无法将条形绘制在它们应该在的位置,就像任何类型的一样条形图本身有多个系列。 (我对日期标签放置算法感到非常自豪:工作中的权力不想放弃这种外观。)
这是一个行不通的方法。数据应填充水平范围。 (不同宽度的条是故意的 - 它是年度和季度数据的组合。)
EDIT 2
我记得我为什么没用Filling
in a DateListPlot
像迈克·霍尼彻奇(Mike Honeychurch)的包一样绘制条形 - 如果您有除非常细的条形以外的任何东西,它们最终会将顶部边缘放在错误的位置。
DateListPlot[{dateARList},
PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0},
FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}},
PlotRange -> All]