15

创建图的行/列/网格的最简单方法是什么,整个网格都有一个 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 通常不会与我在笔记本中看到的比例相同,并且必须具有可读但不能过大的字体)

4

3 回答 3

17

您可以使用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}}]

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

这是一个带有扩展面板的

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

在此处输入图像描述

于 2011-04-28T15:09:53.113 回答
9

您已经知道如何通过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]

三联画

Top您也可以选择在和Right边缘上包含标签。

于 2011-04-28T14:56:41.767 回答
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]

在此处输入图像描述

于 2011-04-28T23:27:17.377 回答