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