Plot 倍频程-在每N个数据点添加一个使用标记的绘图,带有或不带线

Plot 倍频程-在每N个数据点添加一个使用标记的绘图,带有或不带线,plot,octave,legend,variadic-functions,Plot,Octave,Legend,Variadic Functions,我有一个剧本,它创造了很多人物,每个人物都有几个情节。 数据点非常接近,因此无法区分 对我来说,一个解决方案是为每N个数据点使用标记 我可以用两句话替换每个plot/loglog/等句子, 一个用于仅绘制线,我的意思是保留所有数据点,以及 一个只用于绘制标记。 然后,我应该设置一个要添加到图例中的条目,最好同时使用线条和标记。 理想情况下,我会有一个快速的方法,用新版本替换我的旧情节的每个实例 例如 。。。老话 pname = 'n'; % <-- This could actuall

我有一个剧本,它创造了很多人物,每个人物都有几个情节。 数据点非常接近,因此无法区分

对我来说,一个解决方案是为每N个数据点使用标记

我可以用两句话替换每个plot/loglog/等句子, 一个用于仅绘制线,我的意思是保留所有数据点,以及 一个只用于绘制标记。 然后,我应该设置一个要添加到图例中的条目,最好同时使用线条和标记。 理想情况下,我会有一个快速的方法,用新版本替换我的旧情节的每个实例

例如

。。。老话

pname = 'n';   % <-- This could actually be anything
%vvv Change only this vvv
plot(xdata, ydata, 'marker', '+', 'linestyle', '--', 'DisplayName', pname);
... many other plot commands, possibly inside for loops
%^^^ Change only this ^^^
hleg = legend();
set(hleg, "fontsize", 16, ...);
pname = 'n';   % <-- This could actually be anything
%vvv Changed only this vvv
%  plot(xdata, ydata, 'marker', '+', 'linestyle', '--', 'DisplayName', pname);
New 2 or 3 lines
% ... many other plot commands, possibly inside for loops
New 2 or 3 lines for each plot command
%^^^ Changed only this ^^^
hleg = legend();
set(hleg, "fontsize", 16, ...);
我将添加第三个plot命令,仅使用组合标记和线设置打印第一个值,并保存该句柄。稍后,您只能将该句柄馈送到legend命令,只获得一个条目:

1. 函数retval=plot_skipvargin nskip=varargin{1}; symb=varargin{2}; line=varargin{3}; 扩展数据=varargin{4}; ydata=varargin{5}; plotxdata,ydata,line,varargin{6:end}; 等等 plotxdata1:nskip:end,ydata1:nskip:end,symb,varargin{6:end}; h3=绘图xData1,ydata1,唯一[line symb]; 拖延; 传奇3; retval=0; 端功能 x=linspace0,4*pi,101; y1=sinx; y2=cosx; 图1; 图5,‘rx’、‘r-’、x、y1; 图2; 图10,‘bo’、‘b-’、x、y2; 由此得出的两个数字如下所示:

目前,我只连接标记和线条设置,并使用unique来消除提供的双重颜色信息。如果标记和线条的颜色不同,则需要添加一些逻辑来处理。此外,您可能希望通过varargin传递图例条目的信息

编辑:我刚刚意识到,在我的第二个示例中,第二个-get也被unique命令删除,因此图例中的条目是错误的。因此,结合线条和标记设置的逻辑应该更复杂

编辑:由于标记设置可能包括像“x”这样的字母,并且我们需要从其中一个设置中删除颜色信息,因此我选择使用标记设置中的颜色信息,从而从行设置中删除任何字母,然后合并两个字符串

此外,我还修改了代码,以便可以将绘图添加到现有图形中。然后,您需要存储函数调用的句柄:

1. 函数h=plot_skipvargin nskip=varargin{1}; symb=varargin{2}; line=varargin{3}; 扩展数据=varargin{4}; ydata=varargin{5}; 等等 plotxdata,ydata,line,varargin{6:end}; plotxdata1:nskip:end,ydata1:nskip:end,symb,varargin{6:end}; %使用标记设置中的颜色,因为行设置不包括字母 comb=[symb,regexprepline,'[a-zA-Z]',] h=绘图xData1,ydata1,梳; 拖延; 端功能 x=linspace0,4*pi,101; y1=sinx; y2=cosx; 图1; 图例_h=[]; legend_hend+1=绘图5,‘rx’、‘r-’、x、y1; legend_hend+1=图10,‘bo’、‘b-’、x、y2; 传奇{'sinx','cosx'}; 这样做的好处是,您可以在一个图形的末尾提供任何描述

更新后的输出:

我将添加第三个plot命令,仅使用组合标记和线设置打印第一个值,并保存该句柄。稍后,您只能将该句柄馈送到legend命令,只获得一个条目:

1. 函数retval=plot_skipvargin nskip=varargin{1}; symb=varargin{2}; line=varargin{3}; 扩展数据=varargin{4}; ydata=varargin{5}; plotxdata,ydata,line,varargin{6:end}; 等等 plotxdata1:nskip:end,ydata1:nskip:end,symb,varargin{6:end}; h3=绘图xData1,ydata1,唯一[line symb]; 拖延; 传奇3; retval=0; 端功能 x=linspace0,4*pi,101; y1=sinx; y2=cosx; 图1; 图5,‘rx’、‘r-’、x、y1; 图2; 图10,‘bo’、‘b-’、x、y2; 由此得出的两个数字如下所示:

目前,我只连接标记和线条设置,并使用unique来消除提供的双重颜色信息。如果标记和线条的颜色不同,则需要添加一些逻辑来处理。此外,您可能希望通过varargin传递图例条目的信息

编辑:我刚刚意识到,在我的第二个示例中,第二个-get也被unique命令删除,因此图例中的条目是错误的。因此,结合线条和标记设置的逻辑应该更复杂

编辑:由于标记设置可能包括像“x”这样的字母,并且我们需要从其中一个设置中删除颜色信息,因此我选择使用标记设置中的颜色信息,从而从行设置中删除任何字母,然后合并两个字符串

此外,我还修改了代码,以便可以将绘图添加到现有图形中。那么,你 需要以某种方式存储函数调用的句柄:

1. 函数h=plot_skipvargin nskip=varargin{1}; symb=varargin{2}; line=varargin{3}; 扩展数据=varargin{4}; ydata=varargin{5}; 等等 plotxdata,ydata,line,varargin{6:end}; plotxdata1:nskip:end,ydata1:nskip:end,symb,varargin{6:end}; %使用标记设置中的颜色,因为行设置不包括字母 comb=[symb,regexprepline,'[a-zA-Z]',] h=绘图xData1,ydata1,梳; 拖延; 端功能 x=linspace0,4*pi,101; y1=sinx; y2=cosx; 图1; 图例_h=[]; legend_hend+1=绘图5,‘rx’、‘r-’、x、y1; legend_hend+1=图10,‘bo’、‘b-’、x、y2; 传奇{'sinx','cosx'}; 这样做的好处是,您可以在一个图形的末尾提供任何描述

更新后的输出:


可以指定要为图例添加标签的图形对象。根据图例文件:

图例标签与轴的子项相关联;第一个标签指定给在轴上打印的第一个对象,第二个标签指定给打印的下一个对象,等等。要标记特定数据对象,而不标记所有对象,请在输入框中提供其图形句柄

这里有一个例子

t=0:0.01:2*pi; x=1:50:长度t; hs=绘图t,sin t,'-';保持在%正弦线上 hsm=绘图tx,sin tx,'o';%正弦标记 hc=曲线图t,cos t,'-';%余弦线 hcm=绘图tx,cos tx,'o';保留%余弦标记 图例[hsm,hc],{'Sin标记','Cos线'}; 免责声明:我使用的是octave 6.1.0。我不知道这个功能是否是新的

注:如果你想同时显示行和标记,则先用标记进行两次单独的调用,然后用行进行调用,似乎会导致标记与行重叠。例如

图例关闭%正在刷新,以防万一 传说[hsm,hcm],{'which man','Who care'}; 图例[hs,hc],{'组合正弦','组合余弦'}; 免责声明2:我不知道这是一个bug还是一个特性:p

更新

看起来需求已经发生了变化,需要在没有参数的情况下调用图例,并且需要在非常特定的范围内控制绘图对图例的可见性

在这种情况下,可以使用plot对象的Handleviability属性

可处理性:回调|关闭|{on} 如果禁用了Handleviability,则对象的句柄 在其父对象的子对象属性中不可见。 例如:

t=0:0.01:2*pi; x=1:50:长度t; h1=图t,sint,'b-';等等 h2=绘图tx,sintx,'ro'; h3=地块tx,sintx,‘g-o’;拖延 设置h3,‘可见’、‘关闭’ 设置[h1,h2],“可操作性”,“关闭” 传奇
可以指定要为图例添加标签的图形对象。根据图例文件:

图例标签与轴的子项相关联;第一个标签指定给在轴上打印的第一个对象,第二个标签指定给打印的下一个对象,等等。要标记特定数据对象,而不标记所有对象,请在输入框中提供其图形句柄

这里有一个例子

t=0:0.01:2*pi; x=1:50:长度t; hs=绘图t,sin t,'-';保持在%正弦线上 hsm=绘图tx,sin tx,'o';%正弦标记 hc=曲线图t,cos t,'-';%余弦线 hcm=绘图tx,cos tx,'o';保留%余弦标记 图例[hsm,hc],{'Sin标记','Cos线'}; 免责声明:我使用的是octave 6.1.0。我不知道这个功能是否是新的

注:如果你想同时显示行和标记,则先用标记进行两次单独的调用,然后用行进行调用,似乎会导致标记与行重叠。例如

图例关闭%正在刷新,以防万一 传说[hsm,hcm],{'which man','Who care'}; 图例[hs,hc],{'组合正弦','组合余弦'}; 免责声明2:我不知道这是一个bug还是一个特性:p

更新

看起来需求已经发生了变化,需要在没有参数的情况下调用图例,并且需要在非常特定的范围内控制绘图对图例的可见性

在这种情况下,可以使用plot对象的Handleviability属性

可处理性:回调|关闭|{on} 如果禁用了Handleviability,则对象的句柄 在其父对象的子对象属性中不可见。 例如:

t=0:0.01:2*pi; x=1:50:长度t; h1=图t,sint,'b-';等等 h2=绘图tx,sintx,'ro'; h3=地块tx,sintx,‘g-o’;拖延 设置h3,‘可见’、‘关闭’ 设置[h1,h2],“可操作性”,“关闭” 传奇 我在下面写了函数plot_skip。 关键是在需要时将属性“handleviability”设置为“off”。 此功能可用于复制粘贴。 然后在代码体中,只需替换

按这个顺序。 它甚至可以用作

plot_skip(nskip, xdata, ydata, 'marker', marker, 'linestyle', 'none', ...)
如果需要,例如,在一个循环或另一个函数中

优点:

它似乎能完成任务。我在不同的场景下进行了测试,所有测试都成功了。 它只需要改变每个句子的情节。。。要绘制_skipnskip,…,没有其他! 它可以像我一样复制粘贴到另一个函数loglog_skip中。 它在全系统范围内变得可访问。 缺点:

它要求参数中有一定的顺序。 为了避免这种情况,应该在函数内部编写解析器。也许可以利用八度音阶本身的部分或全部代码。 代码:

注: 这带来了一个不相关的问题,稍后我会单独发布

是否可以使用给定的id发出多个警告,但更改模板? 这就是我在代码中所做的。 我在下面写了函数plot_skip。 关键是在需要时将属性“handleviability”设置为“off”。 此功能可用于复制粘贴。 然后在代码体中,只需替换

plot(xdata, ydata, ...)

按这个顺序。 它甚至可以用作

plot_skip(nskip, xdata, ydata, 'marker', marker, 'linestyle', 'none', ...)
如果需要,例如,在一个循环或另一个函数中

优点:

它似乎能完成任务。我在不同的场景下进行了测试,所有测试都成功了。 它只需要改变每个句子的情节。。。要绘制_skipnskip,…,没有其他! 它可以像我一样复制粘贴到另一个函数loglog_skip中。 它在全系统范围内变得可访问。 缺点:

它要求参数中有一定的顺序。 为了避免这种情况,应该在函数内部编写解析器。也许可以利用八度音阶本身的部分或全部代码。 代码:

注: 这带来了一个不相关的问题,稍后我会单独发布

是否可以使用给定的id发出多个警告,但更改模板? 这就是我在代码中所做的。
谢谢你的详细回答。第一个注意事项是,我需要它来为包含其中几个图形的图形添加绘图,因此我应该能够将有问题的项目添加到图例中,但不能作为单个项目。@sancho.srestemonicacellio我发布了一个编辑。也许,这更适合你的需要。使用三个图的想法非常有用。谢谢你的详细回答。第一个注意事项是,我需要它来为包含其中几个图形的图形添加绘图,因此我应该能够将有问题的项目添加到图例中,但不能作为单个项目。@sancho.srestemonicacellio我发布了一个编辑。也许,这更符合你的需要。使用三个图的想法非常有用。请看。。。我很高兴听到您的评论。@sancho.srestemonicacellio hm。您的问题已发生重大变化。这实际上是一个新问题。然而,即使有了新的问题,我认为你想得太多了。只需关闭绘图的可处理性,即可获得相同的效果。这将防止在图例中拾取它。老实说,为什么不使用预期的功能,只调用带有感兴趣句柄的legend呢?您是否无法控制调用legend命令的代码部分?@sancho.srestemonicacellio我已经用一个示例更新了我的答案。谢谢!PS:问题的意图没有改变,总是尽可能多地保留旧代码,只改变情节句子看起来是最好的选择。我只是简单地添加了一个例子来说明理想情况下的含义,我将有一个快速的方法用新版本替换我的旧情节的每个实例。如果可能的话,不涉及代码的其余部分,无论是使用带参数的图例还是不带参数的图例。谢谢,请注意并考虑一下。我倾向于这样认为,也许不是很成功。请看。。。我很高兴听到您的评论。@sancho.srestemonicacellio hm。您的问题已发生重大变化。这实际上是一个新问题。然而,即使有了新的问题,我认为你想得太多了。只需关闭绘图的可处理性,即可获得相同的效果。这将防止在图例中拾取它。老实说,为什么不使用预期的功能,只调用带有感兴趣句柄的legend呢?您是否无法控制调用legend命令的代码部分?@sancho.srestemonicacellio我已经用一个示例更新了我的答案。谢谢!PS:问题的意图没有改变,总是尽可能多地保留旧代码,只改变情节句子看起来是最好的选择。我只是简单地添加了一个例子来说明理想情况下的含义,我将有一个快速的方法用新版本替换我的旧情节的每个实例。如果可能的话,不涉及代码的其余部分,无论是使用带参数的图例还是不带参数的图例。谢谢,请注意并考虑一下。不过,我倾向于这样认为,也许不是很成功。
plot_skip(nskip, xdata, ydata, 'marker', marker, 'linestyle', 'none', ...)
%========================================================
% PLOT USING EVERY OTHER nth SYMBOL
% Parameters:
%  varargin: cell array containing all input arguments.
%  Expected format:
%  varargin{1}: nskip
%  varargin{2}: xdata
%  varargin{3}: ydata
%  varargin{4}: 'marker'
%  varargin{5}: marker
%  varargin{6}: 'linestyle'
%  varargin{7}: linestyle
%  varargin{8:end}: all the rest
% =============================================================================

function retval = plot_skip(varargin)
    nskip = varargin{1};
    xdata = varargin{2};
    ydata = varargin{3};
    if (strcmp(varargin{4}, 'marker') != 1)
        warning("Graphics:plotskip-nonstadard-varargin",
          "plot_skip: \'marker\' argument expected");
        retval = 1;
        return;
    endif
    marker = varargin{5};
    if (strcmp(varargin{6}, 'linestyle') != 1)
        warning("Graphics:plotskip-nonstadard-varargin",
          "plot_skip: \'linestyle\' argument expected");
        retval = 1;
        return;
    endif
    linestyle = varargin{7};

    plot(xdata(1:nskip:end), ydata(1:nskip:end), 'marker', marker, 'linestyle', 'none', varargin{8:end}, 'HandleVisibility', 'off');
    plot(xdata(1:end), ydata(1:end), 'marker', 'none', 'linestyle', linestyle, varargin{8:end}, 'HandleVisibility', 'off');
    plot(xdata(1), ydata(1), 'marker', marker, 'linestyle', linestyle, varargin{8:end});
    
    retval = 0;

endfunction

% =============================================================================