图片缩略图

spider_plot

版本14.0 (1.81 MB) 摩西
创建具有可定制的单独轴的蜘蛛或雷达图。
4.8
43评级

112下载

更新2021年4月18日

从GitHub

查看版本历史

在GitHub上查看许可证

编者按:

此文件被选为MATLAB Central本周精选2020年2月7日

此文件被选为MATLAB Central本周精选2019年10月18日

创建一个简单但看起来专业的蜘蛛或雷达图。每个轴的限制可以手动设置。请参阅github自述页面中的文档(https://github.com/NewGuy012/spider_plot)浏览所有可自订的情节设定。

包含的三个函数具有相同的功能,但有3种不同的实现:
•spider_plot()与大多数MATLAB版本兼容。
•spider_plot_R2019b()兼容R2019b及以上版本。它使用了新的参数验证特性。
•spider_plot_class()兼容R2019b及以上版本。它使用了新的图表类特性。

引用作为

摩西(2021)。spider_plotGitHub (https://github.com/NewGuy012/spider_plot)。检索

意见及评分(138

Fialho Nehama

Almut喜力啤酒

林黄团

约翰Chaniot

斯文

斯文

安娜

你好,摩西,

非常感谢!:)
有了你的回答,我找到了我想要的解决办法。
谢谢

摩西

嗨,安娜,
是的,可以增加多于5组的点数。在示例中,“P”中的行数决定图例中的行数,“P”中的列数决定“标签”的数量。如果我没有回答你的问题,请随时澄清。谢谢!

安娜

嗨,摩西,
谢谢你的精心阐述。
是要比外面的5分多吗?
所以你有几个“标签”,可以这么说,如你的例子所示?

亲切的问候

摩西

啊,很好,胡安。我将很快为该错误添加一个修复程序。谢谢!

感谢您添加的功能!

你好再次,

我在使用对数刻度(AxesScaling ='log')时遇到了spider_plot()和spider_plot_R2019b()的问题。假设我有一个点位于X轴上的对数轴上。点的标签显示log10(X)而不是X。我通过在spider_plot_R2019b()的第826行(spider_plot()的第997行)后添加以下代码来修复它:

%%%%%%%%%%%%%%%%%%
如果log_index (2)
%指数的10次方
数据值= 10^数据值;
结束
%%%%%%%%%%%%%%%%%%

我不认为这是一个合适的解决方案,但它对我来说很管用。我希望你能以正确的方式解决它。

摩西

你好Juan,请求的功能已经添加。请参考示例#8。有几点需要注意:
-你可以使用“AxesLabelsOffset”来调整数据标签对数据点的偏移量。
手动设置“AxesLimits”会让蜘蛛图看起来更好。
-目前,这个功能不支持你提供的图片中数据标签的文本值。金宝app如果使用spider_plot()或spider_plot_R2019b,可以在.fig文件中手动调整这些值。
谢谢。

摩西

嗨,胡安,这是个好主意!我将考虑添加这个功能。

你好,摩西。谢谢你的贡献。
你知道如何用标绘点的准确值标注标签吗?
这是我想要得到的结果:https://drive.google.com/file/d/1FQ7E-xLSKXqcCXbdnC7Sk7tJl654oQvT/view?usp=sharing
在绘制图形后,我使用文本框手动添加了这些值。我想在代码中写出来。
谢谢。

这是我想要得到的结果:https://drive.google.com/file/d/1FQ7E-xLSKXqcCXbdnC7Sk7tJl654oQvT/view?usp=sharing

在绘制图形后,我使用文本框手动添加了这些值。我想在代码中写出来。谢谢。

艾米道

坎Yavas

摩西

嗨,Jean-Baptiste,谢谢你的建议!已经添加了所请求的特性。请参考最新的spider_plot_class中更新的示例#7。
% % %
有几件事需要注意:
-整个tiledlayout的全局图例实际上不支持使用matlab中的"legend()"函数,所以我必须在类中实现金宝app一个名为"tiledlegend()"的类
//www.tatmou.com/matlabcentral/answers/516657-global-legend-in-tiledlayout
这个图例的位置可以使用“TiledLegendHandle”来调整,就像使用图例的“Layout”属性来调整普通图例的手柄一样。请参考MATLAB文档中的“布局”一节。
//www.tatmou.com/help/matlab/ref/matlab.graphics.illustration.legend-properties.html
-你也可以通过点击和拖动它或改变它在.fig文件中的“位置”来交互地移动这个图例的位置。
贴图之间的距离可以通过使用“AxesZoom”属性增加整个轴的缩放级别来进一步减小。默认设置为0.7,可以增加到最大值1。
谢谢。

让-巴蒂斯特·Billaud

我今天的第一条评论没有出现……瓷砖的布局很好,谢谢。
我想在我的平铺布局图中添加一个图例,我用matlab中的%legend()%函数完成了它,但它看起来更像最后一个子图的图例,而不是整个图的图例。此外,我想中心的传说框在中心的数字。
在tilesppaces当我改变'紧凑'由'none',我的瓷砖之间的距离差异真的很少,我怎么能更多地减少这个间距?

让-巴蒂斯特·Billaud

我忘记了另一个可以改进的东西:坐标轴值。实际上刻度值是在轴的中心,是否可以稍微移动它来提高能见度?

摩西

嗨,Jean-Baptiste,平铺布局功能已经实现。请查看使用最新的spider_plot_类的示例#7。谢谢!

摩西

嗨,让-巴蒂斯特·,
是的,您可以使用"LegendHandle"使用MATLAB默认图例的所有相同属性自定义图例框。
% % %
例如:
s = spider_plot_class(P);
s.LegendHandle.Visible = 'off';
% % %
目前,类plot与titledlayout不兼容,但其他两个spider_plot函数是兼容的。
我将考虑用titledlayout特性更新类plot。
谢谢。

让-巴蒂斯特·Billaud

你好,
谢谢你的精彩工作,关于课堂情节的2个问题:
如何隐藏传说框?
-这是一种制作类似于副图或平铺布局的职业图的方法吗?

Arpitkumar帕特尔

特殊的工作。
谢谢你分享这些信息。

艾哈迈德·萨因

谢谢你,摩西

摩西

你好艾哈迈德,你可以通过调整“AxesDisplay”和“AxesInterval”设置来实现这一点。

%%%示例%%%
D1 = [5 3 9 1 2];
D2 = [5 8 7 2 9];
D3 = [8 2 1 4 6];
P = [d1;D2;D3);
spider_plot (P,…
‘AxesDisplay’,‘没有’,……
' AxesInterval ', 1);

艾哈迈德·萨因

你好先生
谢谢你出色的图书馆
我有一个问题
如何取消在轴上显示所有数字
轴距0

戴夫Hoadley

非常酷的工作

Marie-Kristin以下两

感谢摩西让我这么快就意识到。太棒了!

摩西

嗨Marie-Kristin,
感谢您的功能建议!我更新了函数,允许“FillOption”和“FillTransparency”现在可以自定义到每个数据组。
您可以参考下面的示例或示例#3。
%%%示例%%%
D1 = [5 3 9 1 2];
D2 = [5 8 7 2 9];
D3 = [8 2 1 4 6];
P = [d1;D2;D3);
s = spider_plot_class(P);
s.AxesLabels = {'S1', 'S2', 'S3', 'S4', 'S5'};
s.AxesInterval = 2;
s.FillOption = {'on', 'on', 'off'};
s. filltransparent = [0.2, 0.1, 0.1];

Marie-Kristin以下两

这就跟你问声好!谢谢你的蜘蛛情节。你是否认为有可能只有少量地块被填满,而有些地块则没有填满?

塞德里克贾米特

抱歉,刚刚看到更新。

谢谢这个伟大的功能

理查德·拉夫

嗨,摩西,
谢谢你的更新和快速回复。这正是我想要的。

摩西

你好理查德,
是的,我更新了函数,以允许蜘蛛图从[0,AxesInterval]之间的任何rho整数开始。下面是一个例子。

%%%示例%%%
S = spider_plot_class([1.2500 1.6667 2.5000 0 2.3333 0.5000]);
s.AxesOffset = 0;
s.AxesPrecision = 2;

感谢所有有用的功能请求!

理查德·拉夫

嗨,摩西,
谢谢你的指正。
我有一个关于绘图的问题:有没有一种方法可以让最小值位于蜘蛛图的中心,而不是第一个?

摩西

你好理查德,
谢谢你指出那个错误。该函数已更新为允许一个数据组没有指定的AxesLimit。
谢谢!

理查德·拉夫

如果用户没有在调用中指定AxesLimits,实现就会出错。

>> s = spider_plot_class([1.2500 1.6667 2.5000 0 2.3333 0.5000]);
使用spider_plot_class/get时出错。AxesLimits(第603行)
错误:对于一个数据组,请输入轴限制的范围。

spider_plot_class/initialize错误(第894行)
如果~ isempty (obj.AxesLimits)

spider_plot_class/update中的错误(第802行)
初始化(obj);

matlab.graphics.chart.internal.ChartBaseProxy/doUpdateInternal错误

在matlab.graphics.chart.internal.ChartBaseProxy/doUpdateChart中出现错误

理查德·拉夫

R2020A和R2019B出现错误。在运行一些示例时也会出现这种情况。

摩西

嗨,塞德里克,
函数已更新,以允许调整字体。你现在可以使用'AxesFont'和'LabelFont'名称-值对来改变字体。
只是提醒一下,您可以通过在控制台中输入“d = listfonts”来检查系统上的字体。
谢谢!

塞德里克贾米特

嗨,摩西,

非常感谢这次活动。

我不知道如何改变轴标签的字体。我已经能够删除它们周围的方框,但我不知道如何更改字体。

谢谢

摩西

嗨,Nicolai,谢谢你找到那个bug!函数已经更新,以便在轴反转时正确显示数据点。
是的,您可以使用“传奇句柄”将传奇位置设置为任何位置。位置”的论点。您也可以参考下面的示例。

%%%示例%%%
D1 = [5 3 9 1 2];
D2 = [5 8 7 2 9];
D3 = [8 2 1 4 6];
P = [d1;D2;D3);
s = spider_plot_class(P);
s.AxesDirection = {'reverse', 'normal', 'reverse', 'normal', 'reverse'};
s.l legendlabels = {'D1', 'D2', 'D3'};
s.LegendHandle.Location = 'southoutside';

尼科莱

你好,摩西,

倒轴好像有问题。轴标记标签显示正确(例如在反转方向),但数据点(标记)不在正确位置。我希望这可以很容易地解决。

另一个问题:是否可以设置图例位置(例如。“southoutside”)?

非常感谢,
尼科

精卫也

好的工具箱

精卫也

我已经找到了一种方法。谢谢你!

摩西

嗨,尼科莱,这是个好主意!我更新了所有的功能,以支持单独设置轴精度。金宝app请参考更新的示例#2。谢谢所有的功能建议。

尼科莱

你好,摩西,

又是我!

是否也可以为每个轴单独设置精度?蜘蛛图的好处是你可以结合不同尺度的轴。一个坐标轴可以从0到1,另一个坐标轴可以从10到100,因此不同的精度将是惊人的。

一如既往,非常感谢。伟大的工作!

摩西

嗨,Nicolai,谢谢你报告这个bug。图例特性现在应该在spider_plot_class()中工作。请参考更新的示例#1。谢谢。

尼科莱

你好,摩西,

更新后的版本工作得非常好:现在可以在spider_plot_class中设置轴限制和反转轴方向!

还有一个问题:是否可以设置图例的位置和方向?

非常感谢!!

尼科

摩西

嗨,Nicolai,关于spider_plot_R2019b_class:
1)目前还没有实现特定轴方向的反转。我认为你的反馈是一个很好的特性,可以添加到下一个版本中。
2)谢谢你让我们注意到这个bug。我将更健壮地测试spider_plot_R2019b_class。
同时,请使用spider_plot()函数。
谢谢!

尼科莱

你好,摩西,

首先感谢你的出色工作。关于spider_plot_R2019b_class,我有两个问题:
1)是否可以反转特定的轴方向?
2)设置轴限制似乎没有效果,但对spider_plot有效。这是有意的吗?

谢谢你!
尼科

摩西

你好,马吕斯,谢谢你报告这个漏洞。我将在下次更新中修复它。同时,请使用spider_plot()函数。
谢谢。

马吕斯穆勒

嗨,摩西,
首先,干得好!

spider_plot_R2019b_class有一个关于轴限制、显示和间隔的错误:在函数initialize(obj)中,在线性轴缩放的情况下,这些属性被重置为默认值。这使得这些属性的集合函数毫无用处。

摩西

嗨,Paula,澄清一下,你的意思是你的数据集的值<1,所以你想调整轴标记以显示0.1或0.05的间隔?

目前,“AxesInterval”选项指定了web的数量,而不是所需的间隔值。
因此,通过使用“AxesLimits”调整“AxesInterval”,您可以调整间隔值。

例如,如果我想要一个轴上的间隔值为0.05,另一个轴上的间隔值为0.1,我可以这样做:
%%%%%%%%%%%%%
D1 = [0.5 0.3 0.9 0.1 0.5];
D2 = [0.5 0.8 0.7 0.2 0.3];
D3 = [0.8 0.2 0.1 0.4 0.1];
P = [d1;D2;D3);
spider_plot (P,…
“AxesInterval”10…
'AxesLimits', [0, 0, 0, 0, 0;1,1,1,1,0.5],…
2)“AxesPrecision”;
%%%%%%%%%%%%%%%%%%%%%

如您所见,您可以单独设置每个轴限制,以根据数据获得所需的间隔缩放。

希望这回答了你的问题。

波拉多

嗨,摩西,谢谢你的功能,它真的很有帮助。
一个问题,是否有可能调整代码,使AxesInterval在0.1,0.05?只使用整数不能工作我的数据集。

提前谢谢你

伽柏Remzso

摩西

你好,穆罕默德,谢谢你的评论。我认为你的反馈是一个很好的想法,可以作为一个功能。我将在下一个版本中添加它。谢谢。

默罕默德阿里

嗨,摩西
伟大的工作

对于每个想知道如何关闭围绕轴标签的方框的人,您将第808行替换为以下内容
第808行:'EdgeColor', 'none',…

此外,您可以通过修改下面的线有更轻的轴
第530行:灰色= [0.8,0.8,0.8];
或者更轻
第530行:灰色= [0.9,0.9,0.9];

如果这是你想要的,这会让你看起来更简单一点。

摩西

嗨,Mariusz,我刚刚更新了spider_plot()函数,以允许每个轴的不同比例。请参考更新的示例#6。

***此特性尚未在spider_plot_R2019b()或spider_plot_R2019b_class()中实现。

谢谢,

科学家们Sepczuk

你好,

有可能只为一把斧头换一个刻度吗?例如,所有轴都可能有线性标度,但一个轴应该有对数标度。

Alvise Miotti Bettanini

yuqiang李

嗨,摩西
谢谢你提供了这么好的功能。
来自中国。

摩西

嗨,罗曼,谢谢你的功能建议!我将在下次更新中添加它。

罗马

嗨,摩西
感谢分享这个伟大的功能。
我改变了spider_plot中的代码。M允许设置不同的线条风格等为行
A)在第563行之后添加以下代码:

为line_style, line_width, marker_type, marker_size创建与num_data_groups大小相同的数组
Line_style = cellstr(Line_style);%转换为单元格数组
如果length(line_style) ~= num_data_groups . If
Line_style = repmat(Line_style (1),1,num_data_groups);
结束
Marker_type = cellstr(Marker_type);%转换为单元格数组
如果length(marker_type) ~= num_data_groups
Marker_type = repmat(Marker_type (1),1,num_data_groups);
结束

如果length(line_width) ~= num_data_groups . xml
Line_width = repmat(Line_width (1),1,num_data_groups);
结束
如果length(marker_size) ~= num_data_groups
Marker_size = repmat(Marker_size (1),1,num_data_groups);
结束

B)调整574行的plot命令如下:
情节(x_circular y_circular,……
“线型”,line_style{2},……
“标记”,marker_type{2},……
'Color', colors(ii,:),…
“线宽”,line_width (ii),……
MarkerSize, marker_size (ii),……
' markfacecolor ', colors(ii,:));

通过这种方式,您可以为线型、线宽、标记大小、标记提供单元格数组/数组。如果它不匹配组的数量,它将只使用该数组中给出的第一个条目。

请随意将其添加到函数中。
祝你今天过得愉快
最好的问候,
罗马

罗马

Ichechi Weli

摩西

你好Christophe,谢谢你尝试这个功能。是的,一个num_data_group的爬行器是这样显示的,因为轴限制自动缩放到每个数据组的最小值和最大值。为了解决这个问题,您必须手动指定所需的轴限制,如下面的示例所示。
======================================
P = [5 3 9 1 2];
spider_plot_R2019b(P, 'AxesLimits', [1,1,1,1,1;10,10,10,10,10]);
======================================

维克多Ignacio

克利斯朵夫Hurlin

谢谢这个非常有用的功能。但是,如果我们只有一个num_data_group,那么函数spider_plot_R2019b似乎不会生成雷达图。例如,如果我启动P=[5 3 9 1 2];spider_plot_R2019b(P), 5轴出现,但不雷达本身。谢谢。

摩西

你好Zafar,谢谢你的反馈。我已经进行了修复,以允许超过7个传说。请下载最新的代码再试一次。谢谢。

征服者阿里

当我添加超过7个图例时,它会给出一个错误。对于七个或更少的传说,它工作得很好。请帮帮我。谢谢你!

摩西

你好,奥马尔,我很抱歉在休息时延迟回复。感谢您的功能请求;我已经更新了该函数,以添加对titledlayout特性的支持。金宝app现在可以使用spider_plot_R2019b(),就像下面的例子中使用plot()函数一样:

======================================
T = tiledlayout(2,2);

初始化数据点
D1 = [5 3 9 1 2];
D2 = [5 8 7 2 9];
D3 = [8 2 1 4 6];
P = [d1;D2;D3);

%蜘蛛图
nexttile
spider_plot_R2019b (P);

%蜘蛛图
nexttile
spider_plot_R2019b (P);

%蜘蛛图
nexttile
spider_plot_R2019b (P);

%蜘蛛图
nexttile
spider_plot_R2019b (P);

t. tilespcing = 'compact';
t.Padding = '紧凑';
======================================

奥马尔Hadri

你能包括平铺布局支持在未来的版本,我现在这样使用它金宝app
======================================
函数spider_plot_R2019b(tile_loc,tile_x,tile_y, P, options)
...
参数
Tile_loc (:,:) double
Tile_x (:,:) double
Tile_y (:,:) double
...
结束
....
图形属性%%%
%图背景
% FIG =图;
% fig.Color = '白色';
nexttile (tile_loc [tile_x tile_y]);
....
查找对象句柄
text_handles = findobj(nexttile(tile_loc,[tile_x,tile_y]).Children,…
“类型”、“文本”);
patch_handles = findobj(nexttile(tile_loc,[tile_x,tile_y]).Children,…
“类型”、“补丁”);
isocurve_handles = findobj(nexttile(tile_loc,[tile_x,tile_y]).Children,…
“颜色”,灰色,…
'- ', 'Type', 'Line');
Plot_handles = findobj(nexttile(tile_loc,[tile_x,tile_y]))。“——”,孩子们……
“颜色”,灰色,…
'- ', 'Type', 'Line');
....

摩西

你好,托拜厄斯,是的,我已经更新了函数,以允许在所有轴上进行对数缩放。请下载最新版本并查看示例#6。

托拜厄斯克恩

嗨,摩西,首先感谢你分享这个有用的功能!我想知道是否有一个简单的选项来实现对数缩放所有轴?

摩西

嗨,Alex,谢谢你有用的功能建议!我只是更新了函数,以允许顺时针绘制。请看最新的例子。

亚历克斯Grenyer

嗨,谢谢这个非常有用的功能!
一个小事情-函数似乎是逆时针绘制输入(对于P1-x)。能不能顺时针画出来?

非常好!使用方便!

耿东东

不错的工具。

摩西

嗨,马特奥,
我更新了代码,使颜色、标记和行设置成为名称-值对参数。如果您愿意,请下载最新版本并查看示例。
谢谢,
摩西

马特奥比拉尔

嗨,摩西,谢谢你的有用功能。
我有一个问题:我如何改变曲线的颜色?我想自定义线条的颜色。

先谢谢你,
马特奥

摩西

嗨,阿诺德,谢谢你的功能请求。我已经添加了用颜色刻划多边形的能力,现在可调透明度,所以请看看最新版本的最新示例。

阿诺德

是否有一种方法来填充内切线多边形的颜色,理想情况下与一些透明度?

摩西

你好安德烈斯,
感谢您指出min_values(i)和实现手动轴限制的建议!我认为避免更改代码中的特定行是一个好主意。我将在下次发布时更新该功能。
最好的问候,
摩西

最后,这是一个错误检测代码,以确保所有数据都在每个轴的给定范围内。它几乎可以放在spyder plot函数中的任何地方:

%超出范围值的错误检测
for i = 1:size(P,1)
for j = 1:size(P,2)
如果P (i, j) > max_values (j) | | P (i, j) < min_values (j)
error("错误:属性号的值" + num2str(j) +…
" In the stream number " + num2str(i) +…
超出了该属性的给定范围。再检查一下”);
结束
结束
结束

最重要的是,我在这里留下了缺失的一段代码,允许选择哪个轴在径向外时增加或减少。但是您必须将一个参数传递给名为axesLimits的spyder_plot程序,在该程序中,您将希望的每个轴的“最远”值放在第一行,并将希望的原点的“最近”值放在第二行。
首先,你必须在数据的规范化中添加这个pàrt:

%预
max_values = 0 (1, nummofattributes);
min_values = 0 (1, nummofattributes);
axis_increment = 0 (1, nummofattributes);
reverse = false(1, nummofattributes);

如果isempty (axesLimits)
for i = 1: nummofattributes

[在这里插入之前的代码,因此它动态地取Max和min]
结束
其他的
每个属性的最大值和最小值
max_values = max(axesLimits,[],1);
min_values = min(axesLimits,[],1);

for i = 1: nummofattributes
max_values(i) - min_values(i);
Axis_increment (i) = range/axes_interval;

%归一化点的范围为[0,1]
P(:, i) = (P(:, i)-min_values(i))/range;

如果axesLimits(1,i) < axesLimits(2,i)
反向(i) = true;
结束

移位点增加一个轴增量。如果不是,则每个点的最低点
%轴为0。现在,它在0和
% 1和最大值在图形外周长的每个轴上。
如果reverse(i) == false
P(:, i) = P(:, i) + normalized_axis_increment;
结束
结束

然后在图中数据点的定位部分:
x_points = 0 (1, nummofattributes);
y_points = 0 (1, nummofattributes);
将极坐标转换为笛卡尔坐标
for n = 1:numOfAttributes
如果reverse(n) == true
[x_points (n), y_points (n)) = pol2cart(θ(n), axes_limit-P (m, n));
其他的
[x_points (n), y_points (n)) = pol2cart(θ(n), P (m, n));
结束
结束
%使分数循环
X_circular = [x_points, x_points(1)];
Y_circular = [y_points, y_points(1)];

最后,在每个轴的标签放置上:

遍历所有点的数量-标签
for n = 1:numOfAttributes
如果reverse(n) == true
移位最大值%
Shifted_max_value = max_values(n)+axis_increment(n);

每一行的轴标签
Row_axis_labels = (min_values(n):axis_increment(n):shifted_max_value)';

遍历所有等曲线半径
当p = 2时:长度(半径)
显示每条等曲线的轴文本
Text (x_isocves (p, n), y_isocves (p, n), sprintf(sprintf('%%。%如果axes_precision)…
row_axis_labels(长度(半径)- p + 1)),…
“单位”,“数据”,…
“颜色”,“k”,…
”字形大小10…
“HorizontalAlignment”、“中心”,……
“VerticalAlignment”,“中产”);
结束
其他的
移动最小值%
Shifted_min_value = min_values(n)-axis_increment(n);

每一行的轴标签
Row_axis_labels = (shifted_min_value:axis_increment(n):max_values(n))';

遍历所有等曲线半径
当p = 2时:长度(半径)
显示每条等曲线的轴文本
Text (x_isocves (p, n), y_isocves (p, n), sprintf(sprintf('%%。%if', axes_precision), row_axis_labels(p)),…
“单位”,“数据”,…
“颜色”,“k”,…
”字形大小10…
“HorizontalAlignment”、“中心”,……
“VerticalAlignment”,“中产”);
结束
结束
结束

希望它能帮助你的下一个版本摩西!希望你一切顺利

小心!在用于转换数据值的归一化命令中,当使用min_values(i)更一致时,可以减去变量min(组)。如果您的程序没有改动,那么这不会改变什么,但是由于您建议许多人用自己的值来更改最小值和最大值,因此需要减去您想要的最小值,就像您使用命令来计算范围一样。

亨利Ip

Allison米勒

摩西

嗨伊罗拉,
没问题,是的,手动设置所有坐标轴的比例很容易,可以通过将110-111行更改为特定的值来完成:

% %每组的最大值和最小值
% max_values(ii) = max(group_points);
% min_values(ii) = min(group_points);

你可以参考下面Tracy的问题。
然而,如果只改变一个特定的轴,最快的方法可能是替换代码:

%每组的最大值和最小值
如果ii ==(某个索引号)
Max_values (ii) = 9;
Min_values (ii) = 0;
Elseif ii ==(一些索引号)
Max_values (ii) = 400;
Min_values (ii) = 0;
其他的
Max_values (ii) = max(group_points);
Min_values (ii) = min(group_points);
结束

其中“某些索引号”部分是您希望设置坐标轴的数组“P”的列索引。

伊罗拉leguebe

你好,摩西,
很抱歉打扰你,但你可能知道如何帮助我。
我用你的程序使我的图表走得很好,我感谢你。然而,我想要改变坐标轴,但我做不到。我需要两个,一个水平的,一个垂直的,从0到9,从0到400。你知道怎么做吗?
这是我的剧本:
明确的工作空间
关闭所有;
clearvars;
clc;
点属性
Num_of_points = 59;
Row_of_points = 5;
% %数据
负载X4.txt
P1 = X4 (: 1);
P2 = X4 (:, 2);
P3 = X4 (:, 3);
P4 = X4 (:, 4);
P5 = X4 (:, 5);
P6 = X4 (:, 6);
Pbis = [P2、P3, P4、P5 P6);
P = ' (Pbis);
创建通用标签
P_labels =细胞(1、num_of_points);
对于ii = 1:num_of_points
P_labels{ii} = sprintf('%g', P1(ii,1));
结束
% %图形属性
图(“单位”,“归一化”,“外置”,[0 0.05 1 0.95]);

轴属性
Axes_interval = 2;
Axes_precision = 1;

% %蜘蛛图
spider_plot(P, P_labels, axes_interval, axes_precision, 'Marker', '+', 'LineStyle', '-', 'LineWidth', 2,'MarkerSize', 5);

Title属性
%标题(“雷达”、“Fontweight”、“大胆”,“字形大小”,12);

% %图例属性
传奇('vitesse de montée','vitesse de banderolage','étirage','pré-étirage','mass ','Location', 'southoutside');

摩西

你好,Yat Sheng Kong,

这个错误似乎是由于is成员函数的使用方式或者是由于并行计算工具箱的使用方式引起的。无论哪种情况,都有一些奇怪的事情发生,因为蜘蛛绘图函数既不需要ismember也不需要并行计算工具箱。

对于ismember函数,请检查以下内容:
//www.tatmou.com/matlabcentral/answers/152217-ismember-legacy-flag-with-older-matlab
https://stackoverflow.com/questions/20494721/matlab-bug-in-ismember

对于IdleTimeout错误,请检查以下内容:
//www.tatmou.com/matlabcentral/answers/179509-parallel-programming-toolbox-shutting-down
//www.tatmou.com/matlabcentral/answers/410692-parallel-pool-shut-down-during-the-iteration

我将通过尝试运行不依赖于这两个问题的函数来隔离问题,并从那里开始工作。希望这能有所帮助!

逸胜港

嗨,雅克布,

我用Matlab 2018运行,它给了我这个错误。

ismember>ismemberR2012a错误(第196行)
lia = ismemberclassttypes (a,b);

已达到IdleTimeout。
使用“本地”配置文件的并行池正在关闭。

是电脑的问题吗?

摩西

嗨,雅克布,
你对函数的输入是什么?我最初的猜测是,你可能需要转置数组p。我建议使用上面描述中的示例脚本,并用你的数据替换它,看看它是否有效。谢谢你!

雅克布

摩西,谢谢分享!我试图只绘制一个数据集,但一直得到这个错误:

索引超过数组元素个数(0)。

spider_plot中的错误(第221行)
Text (x_iscurves (ii, hh), y_iscurves (ii, hh), sprintf(sprintf('%%.%if',
axes_precision), row_axis_labels (ii)),…

Untitled错误(第86行)
spider_plot(P, P_labels, axes_interval, axes_precision);

任何建议吗?

摩西

嗨,Libor,我很高兴你发现它有用。我注意到其他用户报告说,该功能有时需要一些时间才能运行。如果你对你所做的以及我如何使它与各种MATLAB版本更加兼容有任何反馈,那将非常感激。

对于图例字符串,您只需要用您选择的字符串单元格更改legend命令,或者在提供的示例代码中使用P_labels变量。

%图例属性
legend(P_labels, 'Location', 'southoutside');

legend({'您选择的字符串'},'位置','向南');

谢谢你的建议。反转轴的方向是我的想法,可能会在下一个版本中实现。

亲爱的摩西,
谢谢你这个漂亮和有用的功能!
我花了一些时间让它运行起来,但后来,我做了我想要的!
总有一些可能的改进是我间接实现的。
例如,我有兴趣输入字符串,它将出现在图例中,而不是data1, 2,…
你能给我带路吗?
另一件事是决定轴的方向,有时在顶部设置一个最小值会更好。
我通过输入负值来排列,这对我来说已经足够了。
再次感谢Libor

库尔特·斯图尔特

谢谢你

春晖朱

嗨,Freya,如果你还需要标准化最小值,你需要将第118行更改为:
P(:, ii) = (P(:, ii)-min(min(P)))/range;
(否则雷达图中距离会缩小,导致图结果错误)

摩西

嗨,弗雷娅,
谢谢你发现了描述中的错别字。我会在下一个发布的版本中改正它。

弗雷娅H

嗨,摩西,

抱歉之前的评论,这是意外发生的,显然我不能再删除它。
谢谢你精彩的蜘蛛情节!
我只是有一个超级小的评论:P_labels在你的示例脚本中是一个字符单元格,而不是字符串(如函数描述中所述)。但是字符和字符串都不会导致错误,所以我猜这没有太大关系;)

部长DEMBELE

我最终使用了Gabriela的pol2cartvect函数,它正在工作。谢谢!

摩西

嗨,丹尼尔,
听起来可能是由于一些函数名称冲突,导致函数无意地递归地调用自己。请参阅下面的MATLAB Answers文章以供参考。

//www.tatmou.com/matlabcentral/answers/218422-how-to-get-rid-of-the-error-message-set-0-recursionlimit-n
//www.tatmou.com/matlabcentral/answers/242157-errors-when-using-close-or-close-all

在文章中,功能独特。M导致了错误,但根据你的代码,它可能是不同的函数名。

丹尼尔·Ng

嗨,摩西,

我试着用函数文件运行脚本。然而,我收到了一个错误消息,说明:

达到了500的最大递归限制。使用
set(0,'RecursionLimit',N)更改限制。请注意
超过可用堆栈空间会导致MATLAB和/或崩溃
你的电脑。

ismembercismemberclassttypes错误

我不确定这个错误具体指的是什么。你能给我点建议吗?谢谢你!
丹尼尔

恒洋邓

摩西

嗨,特蕾西,
默认情况下,它使用数据的max和min以及axes_interval输入参数来确定轴。但是,是的,您可以根据需要自定义轴。

如果您希望将“1.0”标记为最小轴值或最大轴值,只需在第110和111行输入该值。例如:
Max_values (ii) = 1;
Min_values (ii) = 0;

如果您希望在轴上标记“1.0”,最简单的方法是求解axes_interval整数和max和min限制,将“1.0”显示为一个标记。

特蕾西·坎贝尔

嗨,摩西,

谢谢你的帮助,这正是我要找的!我有一个后续的问题-是否有一种方法来设置轴上显示的特定数字?例如,我希望在所有轴上都标记“1.0”。

再次感谢你的帮助!

摩西

嗨,Tracy,如果你需要相同的轴,你可以在110和111处更改代码行

Max_values (ii) = max(group_points);
Min_values (ii) = min(group_points);

max_values(ii) = max(max(P));
min_values(ii) = min(min(P));

摩西

对不起,下面的帖子有一个错别字,应该是这样的

max_values(ii) = max(max(P));
min_values(ii) = min(min(P));

摩西

嗨,特蕾西,

你需要一个用户定义或基于数据的最小和最大轴限制?

特蕾西·坎贝尔

嗨,摩西,

是否有一个快速编辑,我可以做,以设置所有的轴是相同的长度?

谢谢你的帮助!

摩西

你好索汉姆,

谢谢你的建议。实际上,在以前的版本中我有这个功能,但由于某种原因,我现在似乎不记得了。

是的,有一个简单的方法。只需将110行改为:

Max_values (ii) = max(group_points);

max_values(ii) = max(max(P));

它应该把所有的值都缩放到最大值。

索汉姆Choudhury

大家好,谢谢分享剧情。对我来说,这是展示蜘蛛/雷达图的最佳方式。然而,对于设置各个轴的范围,我有一个小小的疑问。假设我有4个数据值(P的维数是4x4),但这些矩阵的最大范围不相同,但是我希望根据所有值的最大值来缩放图形。例如,如果P(:,1) =[3 0 0 0]并且P(:,2) =[0 1 5 1],那么我希望5也是第一列的最大值。情节也会相应调整。
你能告诉我怎么做吗?这对我帮助很大。

谢谢你!

摩西

还有Virginia,需要注意的一件事是,蜘蛛图目前只显示径向递增的值,即使是负值。我可能会在未来的修订中添加一个选项来逆转这一点。

摩西

嗨,维吉尼亚,
谢谢你抓到这个。我已经在最新的更新中更正了这个问题。现在只有一个函数,因为我认为有多个轴更有用。如果还有什么问题,请告诉我。

嗨,谢谢你分享你的工作!
我如何改变你的spider_plot_multi_axis极轴限制?在极坐标图中半径为负值。使用Matlab函数极坐标,我只需要添加rlim来调整r轴限制以包括负值,但这个解决方案在您的函数中不起作用。我该如何解决这个问题呢?
谢谢你!

摩西

嗨,基督徒,

我很高兴你能做到这一点。只是出于好奇,这是pol2cart的问题吗?Gabriela在下面的评论中提到了一些问题,并提出了一个解决方案。

基督教

经过一些小的改变(我使用2015a)它工作得很好:)

基督教

你好,
我在试着运行你的算法。
然而,它不工作,我也不明白以下:
%极性点
半径= [0;axes_limit];
Theta = 0:polar_increments:2*pi;
将极坐标转换为笛卡尔坐标
[x_axes, y_axes] = pol2cart(theta,半径);

这行不通。(不同的尺寸)
欢迎反馈意见:)

摩西

嗨,安东尼娅,

是的,运行如下所示的代码将不起作用。您需要做的是将上面概述中的函数(spider_plot.m)和示例脚本保存到单独的文件中。如果函数和示例脚本分别保存在同一目录中,则应该可以正常工作。如果你想将函数保存到不同的目录,你需要将文件夹路径保存在“Home”功能区面板中的“Set path”按钮下。

安东尼娅

你好,
是的,我就是这么做的。
这是我正在执行的matlab代码:

函数spider_plot(P, P_labels, axes_interval, varargin)
创建一个蜘蛛网或雷达图

% spider_plot(P, P_labels, axes_interval)使用
P的列包含数据
%点,P的行包含多组数据点。
每个点必须伴随着单元格中指定的标签
% P_labels。指定分隔轴的间隔数
% by axes_interval。

% P -[向量|矩阵]
% P_labels -[字符串单元格]
% axes_interval - [integer]

% spider_plot(P, P_labels, axes_interval, line_spec)的工作原理与
%上述函数。属性中添加其他行属性
与MATLAB中默认的绘图函数格式相同。

% line_spec -[字符向量]


% %%%%%%%%%%%%%%%%%%% 一般的蜘蛛图的例子 %%%%%%%%%%%%%%%%%%%
清理工作区
关闭所有;
clearvars;
clc;

%点属性
Num_of_points = 6;
Row_of_points = 4;
P = rand(row_of_points, num_of_points);

%创建通用标签
P_labels = cell(num_of_points, 1);

对于ii = 1:num_of_points
P_labels{ii} = sprintf('Label %i', ii);
结束

%图形属性
图(“单位”,“归一化”,“外置”,[0 0.05 1 0.95]);

%轴间隔
Axes_interval = 4;

%蜘蛛图
spider_plot(P, P_labels, axes_interval,…
“标记”,“o”,…
的线型 ', '-',...
“线宽”,2,…
“MarkerSize”,5);

% Title属性
标题(“蜘蛛样本”,…
“Fontweight”、“大胆”,…
“字形大小”,12);

%图例属性
legend('show', 'Location', 'southoutside');
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

点属性%%%
%点数
[num_of_rows, num_points] = size(P);

极轴%%%
%极性增量
极化增量= 2*pi/num_points;

计算轴的最大限制
max_value = max(max(P));
Axes_limit = ceil(max_value*10)/10;

%极性点
半径= [0;axes_limit];
Theta = 0:polar_increments:2*pi;

将极坐标转换为笛卡尔坐标
[x_axes, y_axes] = pol2cartvect(theta,半径);

绘制极轴
灰色= [1,1,1]* 0.5;
H = line(x_axes, y_axes,…
“线宽”,1,…
“颜色”,灰色);

遍历所有行句柄
对于ii = 1:长度(h)
从图例中移除极轴
h (2) .Annotation.LegendInformation。IconDisplayStyle = 'off';
结束

极性等曲线%%%
增量半径%
半径= (0:axes_limit/axes_interval:axes_limit)';

将极坐标转换为笛卡尔坐标
[x_iscurves, y_iscurves] = pol2cartvect(theta,半径);

绘制极性等曲线
抓住;
H = plot(x_iscurves ', y_iscurves ',…
“线宽”,1,…
“颜色”,灰色);

遍历所有的图句柄
对于ii = 1:长度(h)
从图例中删除极性等曲线
h (2) .Annotation.LegendInformation。IconDisplayStyle = 'off';
结束

数据点%%%
遍历所有行
对于ii = 1:num_of_rows
将极坐标转换为笛卡尔坐标
[x_points, y_points] = pol2cartvect(theta(1:end-1), P(ii,:));

%使分数循环
X_circular = [x_points, x_points(1)];
Y_circular = [y_points, y_points(1)];

百分比绘图数据点
Plot (x_circular, y_circular, varargin{:});
结束

轴属性%%%
%图背景
FIG = gcf;
fig.Color = '白色';

%遍历等曲线半径
对于ii = 1:长度(半径)
显示每条等曲线的轴文本
文本(x_isocurves (2,1), 0, sprintf (% 3.1 f,半径(ii)),…
“单位”,“数据”,…
“颜色”,“黑”,…
”字形大小10…
“HorizontalAlignment”、“中心”,……
“VerticalAlignment”,“中产”);
结束

%标签点数
X_label = x_iscurves (end,:);
Y_label = y_iscurves (end,:);

检查标签数是否等于点数
if length(P_labels) == num_points
遍历每个标签
对于ii = 1:num_points
点的角度(以弧度为单位)
Theta_point = theta(ii);

找出这个点在哪个象限
如果theta_point == 0
象限= 0;
Elseif theta_point == pi/2
象限= 1.5;
Elseif theta_point == PI
象限= 2.5;
Elseif theta_point == 3*pi/2
象限= 3.5;
Elseif theta_point == 2*pi
象限= 0;
Elseif theta_point > 0 && theta_point < pi/2
象限= 1;
Elseif theta_point > pi/2 && theta_point < pi
象限= 2;
Elseif theta_point > PI && theta_point < 3* PI /2
象限= 3;
theta_point > 3*pi/2 && theta_point < 2*pi
象限= 4;
结束

根据象限调整文本对齐信息
开关象限
例0
Horz_align = 'left';
Vert_align = 'middle';
案例1
Horz_align = 'left';
Vert_align = 'bottom';
例1.5
Horz_align = 'center';
Vert_align = 'bottom';
案例2
Horz_align = 'right';
Vert_align = 'bottom';
例2.5
Horz_align = 'right';
Vert_align = 'middle';
案例3
Horz_align = 'right';
Vert_align = 'top';
例3.5
Horz_align = 'center';
Vert_align = 'top';
例4
Horz_align = 'left';
Vert_align = 'top';
结束

显示文本标签
text(x_label(ii), y_label(ii), P_labels{ii},…
“单位”,“数据”,…
HorizontalAlignment, horz_align,……
VerticalAlignment, vert_align,……
“EdgeColor”、“k”,……
'写成BackgroundColor ', ' w ');
结束
其他的
%错误信息
错误('错误:请确保标签数量与点数数量相同。');
结束

%轴限制
轴广场;
Axis ([-axes_limit, axes_limit, -axes_limit, axes_limit]);
轴;
结束

% ----------
函数[x,y,z] = pol2cartvect(th,r,z)
如果大小(th, 1) = =大小(r, 1) & & (th, 2) = =大小(r, 2)
X = r.*cos(th);Y = r.*sin(th);
其他的
X = r*cos(th);Y = r*sin(th);
结束
结束

% ----------

非常感谢!

摩西

嗨,安东尼娅,

我刚刚在Matlab R2017a上测试了它,它似乎工作得很好。您尝试过上面概述中的示例代码没有注释(使用select all, Ctrl + A,和uncomment, Ctrl + T删除%符号)吗?

安东尼娅

嗨,摩西,

谢谢你分享你的工作。剩下的一个问题:我试图用Matlab版本2017a使用它,它不工作,因为它不停止运行(所以没有错误消息)。我用pol2cartvect替换了pol2cart。你知道它为什么不管用吗?

谢谢你!

加芙安德雷德

嗨,摩西,
首先,感谢你分享这个惊人的工作。
pol2cart函数确实在我尝试的版本(2014-2016b)的核心库中,但它不能正确地用于向量(我想在不同的matlab版本之间存在相同的老问题)。
如果您愿意,可以随意将pol2cartvect包含在文件包中。
干杯!

摩西

你好Stefano,我添加了一个单独的函数来显示每个参数的轴。请尝试一下,并让我知道你的想法。谢谢。

摩西

你好Stefano,我很抱歉,但目前这个蜘蛛图不支持每个参数的范围轴。金宝app我故意省略了这个功能,因为坐标轴标签变得太拥挤了。相反,我通过将所有数据规范化为百分比单位来解决这个问题。

我可能会在将来更新这个函数以支持每个参数的范围轴,但现在我建议您尝试Micha金宝appel Arant的蜘蛛函数。

致以最亲切的问候。

斯特凡诺Anzilotti

嗨,摩西。你的情节是惊人的,我想使用它。我需要改变每个参数的范围轴,你能帮我吗?先谢谢你

摩西

嗨BuMatlab,

对不起,我以为pol2cart函数是核心matlab库的一部分,但我可能错了。

//www.tatmou.com/help/matlab/ref/pol2cart.html

请在最后插入Gabriela的函数作为子函数,并用pol2cartvect替换pol2cart的所有实例(ctrl + f并替换)。

BuMatlab

你在哪里插入你创建的函数?

加芙安德雷德

你好,米格尔,
试试这个:
将代码中所有对“pol2cart”的调用替换为“pol2cartvect”,并创建这个新函数,如下所示:

% ----------
函数[x,y,z] = pol2cartvect(th,r,z)
如果大小(th, 1) = =大小(r, 1) & & (th, 2) = =大小(r, 2)
X = r.*cos(th);Y = r.*sin(th);
其他的
X = r*cos(th);Y = r*sin(th);
结束
% ----------

这可能有用。
干杯!

米格尔查韦斯

你好,你的例子在Matlab R2015b上也给出了错误。你能帮我检查一下吗?谢谢你!

摩西

嗨,sz,我很高兴它能派上用场。另外,要记住的一点是,如果希望数据以百分比为单位,则可能需要对其进行规范化。

深圳l

对不起,我找到了!这是一个很好的情节!帮助很大!

深圳l

你介意我举个例子吗,谢谢!

摩西

嗨,Esin,你知道错误信息是什么吗?我刚刚在Matlab R2016b上进行了测试,它似乎工作得很好。

Esin Karahan

你好,你的例子在Matlab R2015a上给出错误。你能帮我检查一下吗?谢谢你!

MATLAB版本兼容性
使用R2019b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux
确认

启发:雷达的阴谋

启发:雷达的阴谋

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!