Как создать сетку участков с одной парой FrameLabels?

Каков самый простой способ создания строки/столбца/сетки графиков, при этом вся сетка имеет один FrameLabel?

Мне нужно что-то похожее на это:

p := ListPlot[RandomInteger[10, 5], Joined -> True, Axes -> False, 
  Frame -> True, PlotRange -> {0, 11}, 
  FrameLabel -> {"horizontal", None}, AspectRatio -> 1]

GraphicsRow[{Show[p, FrameLabel -> {"horizontal", "vertical"}], p, p}]

Для формата строки он может иметь одну или несколько горизонтальных меток, но только одну вертикальную.

Вопросы для рассмотрения:

  • Вертикальная шкала должна соответствовать всем графикам и не должна быть разрушена, например. слишком длинная метка или автоматический PlotRangePadding.
  • Требуется хорошее (и изменяемое по размеру!) управление межстрочным интервалом (в конце концов, это одна из причин, по которым удаляются избыточные метки).
  • Общая пространственно-эффективная компоновка. Максимальное содержание, минимальное (ненужное) пробелы.

ИЗМЕНИТЬ

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

Ответы

Ответ 1

Вы можете использовать LevelScheme для достижения желаемого. Вот пример:

<< "LevelScheme`"
Figure[{
  Multipanel[{{0, 1}, {0, 1}}, {1, 3},
   XFrameLabels -> textit["x"], BufferB -> 3,
   YFrameLabels -> textit["Sinc(x)"], BufferL -> 3,
   TickFontSize -> 9,
   XGapSizes -> {0.1, 0.1},
   PanelLetterCorner -> {1, 1}
   ],
  FigurePanel[{1, 1}, PlotRange -> {{-1.6, -0.6}, {-0.5, 1}}],
  RawGraphics[Plot[Sinc[20 x], {x, -1.6, -0.6}]],

  FigurePanel[{1, 2}, PlotRange -> {{-0.5, 0.5}, {-0.5, 1}}],
  RawGraphics[Plot[Sinc[20 x], {x, -0.5, 0.5}]],

  FigurePanel[{1, 3}, PlotRange -> {{0.6, 1.6}, {-0.5, 1}}],
  RawGraphics[Plot[Sinc[20 x], {x, 0.6, 1.6}]]
  },
 PlotRange -> {{-0.1, 1.02}, {-0.12, 1.095}}]

enter image description here

LevelScheme предлагает вам огромную гибкость в расположении вашего участка.

  • Вместо того, чтобы указывать общие метки меток, вы можете переместить определение внутри FigurePanel[] и управлять надписями для каждого отдельно.
  • Вы можете установить интервалы между графиками как в направлениях X, так и Y, а также изменить размеры каждой панели, например, левый может занимать 2/3 пробела, а следующие два - только 1/6 пространство каждое.
  • Вы можете установить индивидуальные диапазоны сюжетов, изменить метки меток кадров для каждого, управлять той стороной панели (сверху/снизу/l/r), метки должны быть отмечены, изменить номера панелей и т.д.

Единственный недостаток заключается в том, что вам, возможно, придется бороться с ним в в некоторых случаях, но в целом я нашел удовольствие использовать.

ИЗМЕНИТЬ

Здесь один похожий на ваш пример:

Figure[{
  Multipanel[{{0, 1}, {0, 1}}, {1, 3},
   YFrameLabels -> textit["Vertical"], BufferL -> 3,
   TickFontSize -> 9,
   XGapSizes -> {0.1, 0.1},
   PanelLetterCorner -> {1, 1}
   ],
  FigurePanel[{1, 1}, PlotRange -> {{1, 10}, {0, 10}}],
  RawGraphics[ListLinePlot[RandomInteger[10, 10]]],

  FigurePanel[{1, 2}, PlotRange -> {{1, 10}, {0, 10}},
   LabB -> textit["Horizontal"], BufferB -> 3],
  RawGraphics[ListLinePlot[RandomInteger[10, 10]]],

  FigurePanel[{1, 3}, PlotRange -> {{1, 10}, {0, 10}}],
  RawGraphics[ListLinePlot[RandomInteger[10, 10]]]
  },
 PlotRange -> {{-0.1, 1.02}, {-0.2, 1.095}}]

enter image description here

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

Чтобы ответить на комментарий мастера Wizard, здесь пустой шаблон для сетки 2x3

Figure[{Multipanel[{{0, 1}, {0, 1}}, {2, 3},
   XFrameTicks -> None,
   YFrameTicks -> None,
   XGapSizes -> {0.1, 0.1},
   YGapSizes -> {0.1}],
  FigurePanel[{1, 1}],
  FigurePanel[{1, 2}],
  FigurePanel[{1, 3}],
  FigurePanel[{2, 1}],
  FigurePanel[{2, 2}],
  FigurePanel[{2, 3}]
  }, PlotRange -> {{-0.01, 1.01}, {-0.01, 1.01}}]    

enter image description here

И здесь один с расширенными панелями

Figure[{Multipanel[{{0, 1}, {0, 1}}, {2, 3},
   XFrameTicks -> None,
   YFrameTicks -> None,
   XGapSizes -> {0.1, 0.1},
   YGapSizes -> {0.1}],
  FigurePanel[{1, 1}, PanelAdjustments -> {{0, 0}, {1.1, 0}}],
  FigurePanel[{1, 2}],
  FigurePanel[{1, 3}],
  FigurePanel[{2, 2}, PanelAdjustments -> {{0, 1.1}, {0, 0}}]
  }, PlotRange -> {{-0.01, 1.01}, {-0.01, 1.01}}]

enter image description here

Ответ 2

Вы уже знаете, как обрабатывать несколько горизонтальных меток с помощью ListPlot. Вы можете получить одиночные ярлыки, используя Panel. Например...

p := ListPlot[RandomInteger[10, 5], Joined -> True, Axes -> False, 
Frame -> True, PlotRange -> {0, 11}, AspectRatio -> 1]

Panel[GraphicsRow[{p, p, p}], {"horizontal",Rotate["vertical", Pi/2]}, 
      {Bottom, Left}, Background -> White]

triptych

Вы также можете включать метки на Top и Right также.

Ответ 3

Вот один из вариантов, который я только что собрал. Его преимущество в том, что это просто.

Мне нравится вид участков Yoda LevelScheme лучше, если предположить, что это можно сделать и для сетки.

p := ListPlot[RandomInteger[10, 5], Joined -> True, Axes -> False, 
  Frame -> True, PlotRange -> {0, 11}, AspectRatio -> 1]

gg = GraphicsGrid[{{p, p, p}, {p, p, p}, Graphics /@ Text /@ {"Left", "Center", "Right"}},
       Spacings -> 5, ItemAspectRatio -> {{1, 1, 0.15}}];

Labeled[gg, Rotate["vertical", Pi/2], Left]

enter image description here