【问题标题】:Assembling multiple Graphics objects组装多个 Graphics 对象
【发布时间】:2011-04-18 20:40:40
【问题描述】:

考虑以下简单示例:

f[x_] = Sin[5 x] + Sin[3 x];
p1 = PolarPlot[f[x], {x, 0, 2 Pi}, ImageSize -> 50 {5, 2.5}, 
  Frame -> True]
p2 = PolarPlot[f'[x], {x, 0, 2 Pi}, ImageSize -> 50 {5, 3}, 
  Frame -> True]

产生以下两个数字

现在我想将它们中的两个对齐,一个在另一个之上,没有任何额外的间隙。执行FullGraphics@GraphicsColumn[{p1, p2}, Frame -> All],返回一个对象,在较短的图形周围有额外的空白(我已经打开所有对象中的框架来说明这一点)

我找不到强制每个列“单元格”垂直适应图像大小的方法(注意:我知道在我的示例中,第二个图中还有额外的水平空白,那就是故意的。我只是想垂直贴合它)。我尝试使用Spacings 选项,但这仍然不能令人满意。所以,我的第一个问题是:“有没有办法使用GraphicsGridGraphicsColumn 或通过任何其他方式来做到这一点?”

另一种方法是像这样使用ImageAssemble

ImageAssemble[Map[FullGraphics, {{p1}, {p2}}, {2}]]

它做了我想要的,但给出了一个光栅化的图像(以下是屏幕截图,因为保存的文件的分辨率要低得多)。

我的实际数字是整齐的矢量图,我什至不想考虑对它们进行光栅化,无论分辨率有多高。所以,我的第二个问题是:“有没有办法从ImageAssemble 获取矢量图形输出?”如果有帮助,我将使用Mma7 并将我的图形保存为Export["filename.pdf",expr]

我知道在所示示例中使用LevelScheme 是可能的。但是,并非所有绘图功能都与LevelScheme 兼容,并且并非在所有情况下都有效。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    结果必须是图形吗?如果没有,您可以使用常规列:

    Column[{p1, p2}, Spacings -> 0]
    

    【讨论】:

    • @Brett:这很好用并且可以很好地导出为向量。你知道为什么GraphicsColumn 的行为不同吗?行为是故意的吗?
    • 我认为GraphicsColumn 正在强制执行ItemAspectRatio 选项,但我还没有找到关闭它的方法。 (事实上​​,我不确定为什么GraphicsGrid 没有遇到同样的问题。)总的来说,我更喜欢使用Grid 而不是GraphicsGrid
    • @Brett: GraphicsGrid 确实有同样的问题。请参阅我在回复巫师先生时提供的this example
    • @Brett ItemAspectRatio 甚至没有在GraphicsColumn 文档页面中列出。不就是简单地与AspectRatio(可设置)除以地块数有关吗?
    • @Sjoerd ItemAspectRatio 是导致@yoda 第二张图片中的两个框架部分具有相同形状的原因,而不是更接近单个图形形状的形状。它没有记录在案,但在Options[GraphicsColumn] 中。 GraphicsColumnGraphicsRowGraphicsGrid 的特例。 (有趣的是ColumnGrid 相关,但Row 不相关。)
    【解决方案2】:

    基于 Brett 的回答,这可能是您想要的:

    FullGraphics@GraphicsGrid[{{p1}, {p2}}, Spacings -> 0]
    

    【讨论】:

    • @Wizard:正如我在问题中提到的,我确实尝试在GraphicsColumn 中使用Spacings(和GraphicsGrid,虽然我没有提到这一点),但没有t 像 Brett 的解决方案那样提供紧凑的安排。 Here's 一个说明我的意思的例子。
    • 或者,也许?间距 -> {0, -10}
    • @TomD:然后它变得非常主观,我每次都必须四处玩耍并找到最佳位置。此外,它并不能完全解决问题。如果您通过拉近它们之间的间距来消除它们之间的间距,则会增加顶部和底部的空白。
    • @yoda,你说:“返回一个对象,在较短的数字周围有额外的空白”,我认为这改善了这一点。我同意,如果您不需要需要使用 GraphicsGrid/GraphicsColumn,那么通用表单(网格/列)通常会更好。
    【解决方案3】:

    方法一:

    • 使用ImageAssemble[{image1},{image2}....]
    • 可以使用ImagePad在每张图片周围添加一些空间:

      ImageAssemble[ {ImagePad[image1,m1]}, {ImagePad[image2,m2]},...]
      
    • 注意 - 所有图像必须具有相同的大小(使用ImageDimensions,以及m1m2 ...)。

    方法二:

    • 定义一个维度为行 x 列的图像数组,例如“myphotos”

      ImageAssemble[myphotos]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 2011-03-02
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多