如何使用LevelScheme在Mathematica中创建子图?

时间:2011-03-25 06:18:56

标签: wolfram-mathematica levelscheme

考虑在MATLAB中生成的以下任意图形作为示例。基本的想法是我有一个等高线图,我想在右边的子图中展示它的选定切片。在mma中是否有等效的子图?

我现在所做的工作就是将切片和箭头以及两个切片图分别绘制成轮廓图,然后将它们放在乳胶中。但是,我希望能够在mma中做到这一点。我该怎么做呢?

我的想法是生成一个完整的垂直和放大的等高线图。半水平纵横比,两个垂直和半垂直的图。半水平纵横比,然后使用GraphicsGrid对齐它们。但这仍然给了我作为列表的情节,而不是复合数字。这是唯一的方式还是有更好,更优雅的方式呢?

enter image description here

3 个答案:

答案 0 :(得分:7)

我知道LevelScheme中的Multipanel可能会让你做你想做的事情 - 但我对它没有多少经验,而且文档中的例子相当稀疏。 我已经粘贴了其中一个例子into this SO answer,所以看看那里,看看你的想法!


这是我对GraphicsGrid的尝试。 Multipanel允许您执行但GraphicsGrid但不允许的操作 是让你使用不同的列/行大小。 这意味着我努力以编程方式绘制箭头,并使用“绘图工具”面板手绘图(

With[{yslice1 = .5, yslice2 = -.8},
 GraphicsGrid[
  {{DensityPlot[Sin[15 x y], {x, -1, 1}, {y, -1, 1}, 
     ColorFunction -> "PlumColors", AspectRatio -> 2,
     Epilog -> {Dashed, White, Line[{{-1, yslice1}, {1, yslice1}}], 
       Line[{{-1, yslice2}, {1, yslice2}}]}],
    Plot[Sin[15 x yslice1], {x, -1, 1}, Axes -> False, Frame -> True]},
   {SpanFromAbove,
    Plot[Sin[15 x yslice2], {x, -1, 1}, Axes -> False, 
     Frame -> True]}},
  Spacings -> {Scaled[0.2], Scaled[0.0]}]]

enter image description here


编辑:

这是使用LevelScheme的相同内容,请注意框架排列。 应该可以添加箭头 - 因为LevelScheme有很多新的箭头指令 - 但我会把它留作家庭作业问题!

<< "LevelScheme`"
{yslice1 = .5, yslice2 = -.8};
Figure[{
  SetOptions[Multipanel, 
   ShowTickLabels -> {True, False, False, True}, Background -> Wheat,
   PanelLetterFontSize -> 10, Margin -> {{40, 40}, {40, 0}}],
  Multipanel[{{0, 1}, {0, 1}}, {2, 2},
   XPlotRanges -> {-1, 1}, YPlotRanges -> {-1, 1},
   XFrameLabels -> textit["x"], YFrameLabels -> textit["y"],
   TickFontSize -> 10, XFrameTicks -> LinTicks[-1, 1, .5, 4], 
   YFrameTicks -> LinTicks[-1, 1, .5, 4],
   BufferL -> 1.5, BufferB -> 3, Order -> Vertical,
   XPanelSizes -> {1, 1}, XGapSizes -> 0.25, YGapSizes -> 0.2],
  FigurePanel[{1, 2}], 
  RawGraphics[
   Plot[Sin[15 x yslice1], {x, -1, 1}, Axes -> False, Frame -> True]],
  FigurePanel[{2, 2}], 
  RawGraphics[
   Plot[Sin[15 x yslice2], {x, -1, 1}, Axes -> False, Frame -> True]],
  FigurePanel[{2, 1}, PanelAdjustments -> {{0, 0}, {0, +1.2}}],
  RawGraphics[
   DensityPlot[Sin[15 x y], {x, -1, 1}, {y, -1, 1}, 
    ColorFunction -> "PlumColors", AspectRatio -> 2],
   Graphics[{Dashed, Thick, White, 
     Line[{{-1, yslice1}, {1, yslice1}}], 
     Line[{{-1, yslice2}, {1, yslice2}}]}]]},
 PlotRange -> {{0, 1}, {0, 1}}, ImageSize -> 2*72*{5, 3}
 ]

scheming

答案 1 :(得分:4)

关于关于GraphicsGrid的OP评论,您可以使用FullGraphics @ GraphicsGrid @ {...}来获取单个图形对象。这对于以PDF格式复制也是必要的。

答案 2 :(得分:2)

这是使Simon的解决方案充满活力的第一步。箭头是针对此特定图像的硬编码。稍后我将尝试更普遍地实施它们。

dp1 = DensityPlot[Sin[15 x y], {x, -1, 1}, {y, -1, 1}, 
   ColorFunction -> "PlumColors", AspectRatio -> 2, PlotPoints -> 30];
Manipulate[
 Show[
  GraphicsGrid[{{dp1 ~Append~
        (Epilog -> {Dashed, White, 
         Line[{{-1, yslice1}, {1, yslice1}}], 
         Line[{{-1, yslice2}, {1, yslice2}}]}), 
     Plot[Sin[15 x yslice1], {x, -1, 1}, Axes -> False, 
      Frame -> True]}, {SpanFromAbove, 
     Plot[Sin[15 x yslice2], {x, -1, 1}, Axes -> False, 
      Frame -> True]}}, Spacings -> {Scaled[0.2], Scaled[0.0]}],
  Graphics[{Red, {Arrowheads[Large],
     Arrow[{{380, Rescale[yslice1, {-1, 1}, {-646, -46}]}, {440, -170}}], 
     Arrow[{{380, Rescale[yslice2, {-1, 1}, {-646, -46}]}, {440, -530}}]
     }}],
  ImageSize -> 600
 ],
 {{yslice1, 0.5, "Slice 1"}, -1, 1},
 {{yslice2, -0.8, "Slice 2"}, -1, 1}
]

这是一个稍微不同的方法,将箭头放在Epilog内,将其位置链接到左图,可能更容易使用。

dp1 = DensityPlot[Sin[15 x y], {x, -1, 1}, {y, -1, 1}, 
   ColorFunction -> "PlumColors", AspectRatio -> 2, PlotPoints -> 30, 
   PlotRangeClipping -> False, 
   ImagePadding -> {{Automatic, 100}, {Automatic, Automatic}}];
Manipulate[
 Show[
  GraphicsGrid[{{dp1~
      Append~(Epilog -> {{Dashed, White, 
          Line[{{-1, yslice1}, {1, yslice1}}], 
          Line[{{-1, yslice2}, {1, yslice2}}]}, {Red, 
          Arrowheads[Large],
          Arrow[{{1, yslice1}, {1.7, 0.88}}], 
          Arrow[{{1, yslice2}, {1.7, -0.9}}]
          }}), 
     Plot[Sin[15 x yslice1], {x, -1, 1}, Axes -> False, 
      Frame -> True]}, {SpanFromAbove, 
     Plot[Sin[15 x yslice2], {x, -1, 1}, Axes -> False, 
      Frame -> True]}}, Spacings -> {Scaled[-0.2], Scaled[0.0]}],
  ImageSize -> 600
  ],
 {{yslice1, 0.5, "Slice 1"}, -1, 1},
 {{yslice2, -0.8, "Slice 2"}, -1, 1}
 ]