【问题标题】:How to reproduce figure through a previously saved figure handle?如何通过之前保存的图形句柄重现图形?
【发布时间】:2013-07-06 02:20:30
【问题描述】:

我在 3d 散点图中绘制了一组数据的分布。

h = scatter3(D1,D2,D3,'.');

我已保存h,但现在需要重现图表。我应该在h 上调用什么函数,这样我就可以在不重新计算 D1、D2、D3 的情况下获得图形?因为重新计算 D1、D2、D3 的计算成本很高,所以我不想每次需要图表时都这样做。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    如果您有以下信息,则可以完成“重新创建图表”:

    1. 用于创建图表的数据
    2. 使用的图表类型
    3. 任何可选设置(颜色、轴、缩放、方向...)

    图形(或图形)的“句柄”指向存储所有信息的内存 - 但它只是一个指针。除非您保存“指向的内容”,否则对您毫无用处。有一种非常酷的方法可以通过一个命令来实现这一点。创建图形后,您只需键入

    saveas(gcf, 'myLastGraph.m', 'm');
    

    除了gcf(“获取当前图形” - 最近选择的图形的句柄),您可以使用要保存的图形的任何句柄(它必须仍然可见) - 例如,@ 987654323@ 在您的代码示例中。这将在您的当前目录中创建两个文件(如果您在第二个参数中指定完整路径,它将在该目录中创建文件):

    myLastGraph.fig
    myLastGraph.m
    

    现在您可以关闭所有图表,清除所有变量。接下来,您可以简单地运行

    myLastGraph
    

    从命令行 - 将使用保存在磁盘上的数据重新创建您的图表。

    【讨论】:

    • 很好的解释。 @OneZero 用于将图形本身保存在 .fig 文件中,您也可以单击图形窗口中的磁盘按钮。
    • @Adiel - 感谢您的评论。我倾向于寻找在不使用 GUI 的情况下做事的方法——这样你就可以在不需要用户干预的情况下保存,只要你创建了图形。但是是的 - 这实际上创建了 .fig 文件,您也可以使用 GUI 执行此操作。
    【解决方案2】:

    如果图表仍然打开,您可以使用以下方法获取 Xdata、Ydata 和 Zdata:

    XYZCell=get(get(get(h,'currentaxes'),'children'),{'xdata','ydata','zdata'});

    或者如果你不想要一个单元格:

    XData=get(get(get(gcf,'currentaxes'),'children'),'xdata'); YData=get(get(get(gcf,'currentaxes'),'children'),'ydata'); ZData=get(get(get(gcf,'currentaxes'),'children'),'zdata');

    如果图形是封闭的,h 将毫无用处 - 据我所知,没有办法从封闭的图形句柄重新生成图形。

    为什么不先保存变量?

    I1=d1; I2=d2; I3=d3; scatter3(d1,d2,d3,'.');

    【讨论】:

      【解决方案3】:

      “重新计算的计算成本很高”我不确定您是指计算 D1、D2、D3 的值还是绘制这些值。如果计算量很大,请将值保存到工作区或将它们保存到磁盘(例如打印到文件),以便稍后再次加载它们以进行绘图。您还可以将图形保存为 *.fig 文件,稍后您可以打开并编辑该文件,如果绘图速度较慢,这可能是一个不错的选择。

      一旦您关闭窗口,我就无法使用句柄 (h) 来取回您的数据。

      在图形窗口仍然打开的情况下,您可以使用h 拉入数据:

      xyzData = get(get(h, 'children'), {'xdata', 'ydata', 'zdata'});
      

      (注意:h = scatter3(D1,D2,D3,'.');h 设置为 scattergroup 的句柄。@Hugh Nolan 的正确答案要求 h 是该图的句柄。)

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 2011-04-25
        • 2019-11-17
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        相关资源
        最近更新 更多