1

有没有办法以编程方式获取可用于在 Octave 中绘制的标记和线条样式列表?

理想情况下,我会做类似的事情

mslist = whatever_function_for_marker_styles;
lslist = whatever_function_for_line_styles;
for i = 1:np
    plot(x, y(i,:), 'marker', mslist(i), 'linestyle', lslist(i))
endfor

笔记:

  1. 我会添加一些mod函数来循环遍历列表。
  2. 我知道两个列表的大小可能不一样,因此它们可能会在骑车时相互转移。
4

2 回答 2

2

最简单的方法是从手册中获取符号并将它们放入单元格数组中:

mslist = {'+', 'o', '*', '.', 'x', 's', 'd', '^', 'v', '>', '<', 'p', 'h'};

lslist = {'-', '--', ':', '-.'};

您可以使用标准 for 循环遍历它们,并使用大括号通过索引访问它们,例如 lslist{i}。这些符号位于手册的第 15.2.1 节(https://octave.org/doc/v6.1.0/Two_002dDimensional-Plots.html#Two_002dDimensional-Plots)。普通向量适用于 mslist 而不是元胞数组,因为所有符号都是单个字符,但不适用于其中一些是两个字符长的 lslist。

于 2021-02-02T17:14:10.963 回答
1

我同意霍华德的观点,即“完全”以编程方式进行可能是矫枉过正。

但是,如果您确实想这样做,我的赌注是解析 'plot' 命令的 'help' 输出,保证会提到这些点,并且有合理的保证,即使它保持相同的格式如果将来添加更多标记等。

我不会解析整个事情,但如果你这样做,你可能会这样开始:

plotdoc = help('plot');                                                                                                                                                                                                                                                                                                       
[plotdoc_head   , plotdoc_rest] = deal( strsplit( plotdoc     , '     linestyle' ){:} );                                                                                                                                                                                                                                      
[plotdoc_lines  , plotdoc_rest] = deal( strsplit( plotdoc_rest, '     marker'    ){:} );                                                                                                                                                                                                                                      
[plotdoc_markers, plotdoc_rest] = deal( strsplit( plotdoc_rest, '     color'     ){:} );                                                                                                                                                                                                                                      
[plotdoc_colors , plotdoc_rest] = deal( strsplit( plotdoc_rest, '";displayname;"' ){:} );                                                                                                                                                                                                                                     

或类似的东西,然后创造性地使用 regexp 或 strfind / strtoken / strplit 来获得每个类别中必要的令牌。

于 2021-02-02T22:24:42.793 回答