Как сделать сетку графиков с одной парой FrameLabels? - PullRequest
15 голосов
/ 28 апреля 2011

Какой самый простой способ создать строку / столбец / сетку графиков с целой сеткой, имеющей один 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-файлы обычно не будут иметь таких же пропорций, как в блокноте, и должны иметь удобочитаемые, но не слишком большие шрифты)

Ответы [ 3 ]

17 голосов
/ 28 апреля 2011

Вы можете использовать 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) метки должны быть отмечены, изменить нумерацию панелей и т. Д.

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

EDIT

Вот пример, похожий на ваш пример:

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

Чтобы ответить на комментарий г-на Волшебника, вот пустой шаблон для 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

9 голосов
/ 28 апреля 2011

Вы уже знаете, как обрабатывать несколько горизонтальных меток через 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 голосов
/ 29 апреля 2011

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

Мне больше нравится внешний вид графиков LevelScheme от yoda, если предположить, что это можно сделать и для сетки.

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

...