Как на самом деле реализована опция BarSpacing в Mathematica? - PullRequest
7 голосов
/ 03 сентября 2011

Я пытаюсь реализовать функцию 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}]

enter image description here

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}]

enter image description here

Обратите внимание, что данные не охватывают такое же расстояние вдоль оси 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}]

enter image description here

Я трахаюсь целую вечность, пытаясьчтобы найти правильную формулу так, чтобы настройки BarSpacing для пользовательской функции (не замеченные здесь) индуцировали правильные интервалы и ширину полосы, чтобы диапазон горизонтального графика не изменялся, как BarSpacing.

Чего мне не хватает?

РЕДАКТИРОВАТЬ: В ответ на Велизария, это пример того, куда я направляюсь.Это работает, вроде (столбцы не совсем совпадают с линией, но это, вероятно, даты, которые я использую), но случаи со столбцами с накоплением не отображаются на столбцах там, где они должны быть, как и любой видгистограмма сама по себе, где есть несколько рядов.(Я очень горжусь алгоритмом размещения меток даты: действующие власти не хотят отказываться от этого взгляда.)

enter image description here

А вот тот, которыйпросто не работает.Данные должны заполнять горизонтальный диапазон.(Различные полосы ширины являются преднамеренными - это комбинация годовых и квартальных данных.)

enter image description here

РЕДАКТИРОВАТЬ 2

Я помню, почемуЯ не использовал Filling в DateListPlot для рисования баров, как в пакете Майка Хонерчерча - если у вас есть что-то кроме очень тощих баров, то в итоге они имеют верхний край в неправильном месте.

DateListPlot[{dateARList}, 
 PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0}, 
 FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}}, 
 PlotRange -> All]

enter image description here

Ответы [ 2 ]

9 голосов
/ 04 сентября 2011

Возможно, используется опция ChartElementFunction вместо BarSpacing.Например, barplot в коде будет отображать столбчатую диаграмму так, чтобы каждый столбец имел поля gapl слева и gapr справа, где gapl и gapr - это доли от общей ширины бара.

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}]

rectangle chart with no gaps

Это позволит построить гистограмму с полем 0,2 с обеих сторон, что приведет к гистограмме с зазорами в 0,4 от общей ширины баров.Обратите внимание, что позиции столбцов совпадают с позициями на первом рисунке.

barplot[dists, arList, {0.2, 0.2}]

barchart with gaps

Вы можете построить несколько рядов, выполнив что-то вроде

Show[barplot[dists, arList 0.9, {0, 0.5}],
 barplot[dists, arList 0.8, {0.5, 0}, ChartStyle -> LightGreen]] 

two series in one plot

4 голосов
/ 18 октября 2011

Вы можете снять жалобу на FillingStyle, используя CapForm["Butt"].

list = {0.01, -0.81, 0.12, 0.81, 1.79, 1.1, 0.41, 1., 1.33, 1.08, 
  2.16, 1.13, 1.92, 1.64, 1.31, 1.94, 1.71, 0.91, 2.32, 0.95, 1.29, 
  1.28, 2.97, 4.45, 5.11}

DateListPlot[list, {2000, 8}, 
 PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0}, 
 FillingStyle -> {1 -> {{CapForm["Butt"], AbsoluteThickness[14], 
      Darker[Red, 0.25]}}}, PlotRange -> {0, 6}, ImageSize -> 400]

enter image description here

...