如何使用一对FrameLabels制作一个图形网格?

Sza*_*lcs 15 plot wolfram-mathematica levelscheme

创建绘图的行/列/网格的最简单方法是什么,整个网格具有单个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}]
Run Code Online (Sandbox Code Playgroud)

对于行格式,它可以有一个或多个水平标签,但只有一个垂直标签.

需要考虑的问题:

  • 垂直刻度必须与所有绘图匹配,并且不得因例如太长的标签或自动破坏PlotRangePadding.
  • 需要良好(并且可以调整大小!)对绘图间距的控制(毕竟,这是删除冗余标签的动机之一)
  • 一般空间效率的安排.最大内容,最小(不必要)空格.

编辑

我正在努力能够稳健地创建打印就绪数字,这需要大量调整大小.(因为导出的PDF通常与我在笔记本中看到的比例不同,并且必须具有可读但不超大的字体)

abc*_*bcd 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}}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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}}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑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}}]    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是一个扩展面板

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}}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @yodar在第一个`MultiPanel`中添加`Margin - > {{0,0},{10,0}}`对我有用. (2认同)

Dav*_*idC 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]
Run Code Online (Sandbox Code Playgroud)

三联

您也可以选择在边缘TopRight边缘上包含标签.