【问题标题】:How to overlay two ReliefPlots, or other graphics如何叠加两个浮雕图或其他图形
【发布时间】:2011-11-09 15:38:05
【问题描述】:

是否可以在 Mathematica 中叠加两个或多个图形,如果图形是通过 ReliefPlot 或 DensityPlot 等函数生成的,使用 Opacity 控制外观?

例如:

a = ReliefPlot[
        Table[i + Sin[i^2 + j^2], {i, -4, 4, .03}, {j, -4, 4, .03}], ImageSize -> 100]
b = ReliefPlot[
        Table[i + Sin[i^3 + j^3], {i, -4, 4, .03}, {j, -4, 4, .03}], ImageSize -> 100]
Show[a,b]

将两者结合起来,但我不知道如何在此处的任何位置插入不透明度命令以使两者都可见。文档指出这些函数接受与 Graphics 相同的选项(“ReliefPlot 具有与 Graphics 相同的选项,具有以下添加和更改:”),但我不明白如何控制图形......(我可能对图形选项和指令之间的区别感到困惑。)

启蒙 - 不透明 - 非常受欢迎!

编辑:哇,你们比我的 Mathematica 版本快 - 谢谢!

【问题讨论】:

  • 很难选择,有时... :)
  • 我认为 Yoda 的更通用,并且可以更好地控制样式。
  • 我想样式只需要指定一次。

标签: wolfram-mathematica


【解决方案1】:

您必须像这样向ColorFunction 发出不透明指令:

a = ReliefPlot[
  Table[i + Sin[i^2 + j^2], {i, -4, 4, .03}, {j, -4, 4, .03}], 
  ImageSize -> 100]
b = ReliefPlot[
  Table[i + Sin[i^3 + j^3], {i, -4, 4, .03}, {j, -4, 4, .03}], 
  ImageSize -> 100, 
  ColorFunction -> (Directive[Opacity[0.5], 
      ColorData["Rainbow"][#]] &)]
Show[a, b]

通常,在所有*Plot* 函数中,您可以根据具体情况使用PlotStyleColorFunction 控制不透明度。如果这只是一个Graphics 原语,你可能会做类似Graphics[{Opacity[0.5], object}] 的事情。

【讨论】:

    【解决方案2】:

    由于ReliefPlot 没有PlotStyle 选项,您可以使用BaseStyle -> Opacity[0.5] 将透明度引入图形。

    【讨论】:

    • 等一下...只有两个图像具有相同的 BaseStyle 时才有效。
    • @yoda BaseStyleGraphics 的一个选项,因此您可以了解Show 如何组合来自多个图形的选项的所有常见行为。现在我想了一会儿,您可以在对Show 的调用中应用BaseStyle 选项,而不是将其添加到单独的图中。请注意,BaseStyle 将应用于整个图形;不仅仅是来自ab 的原语。
    • 是的,这就是我要指出的。如果您想像我的回答一样在第一个不透明度为 0.5 的情况下覆盖第二个图,则不能使用 BaseStyle...
    【解决方案3】:

    另一种方法是使用Images 和ReliefImage 函数,然后使用ImageCompose 将生成的图像组合在一起:

    ImageCompose[
     ReliefImage[Table[i + Sin[i^2 + j^2], {i, -4, 4, .03}, {j, -4, 4, .03}]],
     {ReliefImage[Table[i + Sin[i^3 + j^3], {i, -4, 4, .03}, {j, -4, 4, .03}]], 
      0.5}
     ]
    

    由于ReliefPlot 本质上也以Graphics 兼容的格式返回像素数据,所以Images 可能更适合您。

    ReliefImage的默认颜色功能不同:可以使用ColorFunction -> "LakeColors"切换到ReliefPlot的那个。

    本来我这里有一个函数可以从ReliefPlot提取栅格数据,但后来Brett Champion在下面的评论中指向RasterImage

    【讨论】:

    • 假设V8,你也可以使用ReliefImage而不是ReliefPlot,但是由于坐标系的不同,你必须反转输入,并且还有一个不同的默认颜色函数。 (ReliefImage 的默认颜色函数对我来说有点暗,但ImageAdd[a,b] 看起来不错。)
    • @Brett 我在找那个但是找不到!! (一些 Linux 界面真的很笨拙,令人沮丧......)将纠正答案。
    【解决方案4】:

    使用透明度的答案将以非常通用的方式起作用,但在这个组合两个 ReliefPlot[] 的特定示例中,您可能需要考虑绘制两者的总和:

    f[i_] := i + Sin[i^2 + j^2];
    g[i_] := i + Sin[i^3 + j^3];
    ReliefPlot[Table[f[i] + g[i], {i, -4, 4, .03}, {j, -4, 4, .03}], ImageSize -> 100]
    

    【讨论】:

    • 谢谢 - 在某些方面这是一个更好的解决方案! Mathematica 的优点之一是它允许您从不同的角度处理问题。
    【解决方案5】:
    Show[a, {Opacity[0.5],#}& /@ b]
    

    【讨论】:

    • +1。或者,可以使用Show[a, {Opacity[0.5], #} & @@@ b] 来达到同样的效果。
    • @jibe 您使用哪个 Mathematica 版本?我刚刚在 Win7 x64 上检查了版本 10.2 的两种解决方案,并且输出在视觉上是相同的。请从问题中的代码开始再次检查。
    • @AlexeyPopkov 你完全正确。在 Mac OS 10.8.5 和 MMA 10.2 上,带有 ReliefPlot 的 OP 示例确实有效。但是,我所做的测试是用我自己的(等高线)图进行的,它不起作用。您可以尝试运行它吗(没有;,但我无法在 cmets 中缩进...)? a = ContourPlot[Sin[x + y], {x, 0, 1}, {y, 0, 1}]; b = ContourPlot[Cos[x - y], {x, 0, 1}, {y, 0, 1}]; Show[a, {Opacity[0.5], #} & /@ b]; Show[a, {Opacity[0.5], #} & @@@ b];
    • @jibe ContourPlot 产生一个结构与ReliefPlot 完全不同的Graphics 表达式。您可以通过应用InputForm 或使用我特别设计的shortInputForm function 来查看此结构。我评论中的代码仅适用于ReliefPlot,并基于ReliefPlot 当前实现的未记录细节(可以在未来版本的Mathematica 中更改)。
    • @jibe 对于ContourPlots,类似的解决方案是Show[a, b] /. RGBColor[r_, g_, b_] :> RGBColor[r, g, b, .5],但它是一种不涵盖所有情况的hack,因此直接的解决方案是添加Opacity通过ContourShadingColorFunction 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多