Я пытаюсь реализовать функцию DateListBarChart
, которая берет датированные данные и выводит гистограмму с теми же местами размещения, что и DateListPlot
.Очень важно, чтобы они наносили данные в одном и том же горизонтальном положении, если даны одни и те же данные, чтобы их можно было объединить с помощью Show
.Мне трудно правильно настроить BarSpacing
, чтобы горизонтальный диапазон графика не изменился, а столбцы остались практически на одном месте.
Мне не удалось вывести правильное масштабирование, так что BarSpacing->{0.2,0.3}
приводит к 20% длины оси x, доступной для этой группы баров, с расстоянием между барами в этой группе и 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
для рисования баров, как в пакете Майка Хонерчерча - если у вас есть что-то кроме очень тощих баров, то в итоге они имеют верхний край в неправильном месте.
DateListPlot[{dateARList},
PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0},
FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}},
PlotRange -> All]