颜色编码的条形图

4个视图(过去30天)
吉莉安穆雷
吉莉安穆雷 2021年7月6日
编辑: dpb 2021年7月9日
我有一个表有3列,时间,步骤,行动,我试图使一个柱状图。我想让时间在x轴上,步骤在y轴上,我想根据动作给代码上色。我使用下面的代码,但我的图形只有一个颜色,蓝色,这可能是因为第一个数据点是循环。我不知道我哪里做错了。提前感谢您的帮助!
图(1)
持有
i = 1:长度(StepsS2.Time)
(StepsS2 b =酒吧。时间,StepsS2.Steps);
如果StepsS2.Action (i) = =“跳”
集(b,“FaceColor”“r”);
elseifStepsS2.Action (i) = =“运行”
集(b,“FaceColor”“y”);
elseifStepsS2.Action (i) = =“蹲”
集(b,“FaceColor”“c”);
elseifStepsS2.Action (i) = =“循环”
集(b,“FaceColor”“b”);
其他的
集(b,“FaceColor”‘g’);
结束
结束
持有
1评论
dpb
dpb 2021年7月6日
上面的代码为每次循环在之前的呈现上反复绘制相同的条形图。
只有一个向量 y 变量, 酒吧() 只创建单个栏对象,并且所有栏都是相同的颜色。最后它是蓝色的,因为最后一个数据点必须是蓝色的 “循环” 这不是第一次。
您需要重新排列表中的数据,为所需的每个条设置一个变量;用NaN填充时间的缺失值,因此这些值将被忽略。
然后只调用bar()一次,并使用条句柄数组设置颜色。
我在最近的一个小案例中演示过 //www.tianjin-qmedu.com/matlabcentral/answers/871108-legend-in-bar-plot?s_tid=srchtitle 虽然曾经有一个 “堆叠” 因为bar()处理的是一个向量,所以要绘制出能够获得三个栏的图形 y 作为一个条形对象,不管输入方向如何。你有一个数组,所以不会遇到这个限制。
附加一个.mat文件,如果想让别人直接玩你的数据…

登录发表评论。

接受的答案

本杰明·克劳斯
本杰明·克劳斯 2021年7月6日
编辑:本杰明·克劳斯 2021年7月6日
我怀疑您的问题是因为您试图与字符向量进行不正确的比较。
你的简历是什么格式的 StepsS2。行动 在吗?它是字符矩阵,字符向量单元数组,字符串数组,还是分类?
你可以通过这样做来判断:
类(StepsS2.Action)
disp (StepsS2.Action)
如果您在应答中包含这些命令的输出,则有人可以为您提供更个性化的应答。
有以下几种可能性:
例如,如果 StepsS2。行动 是字符向量的单元格数组:
如果StepsS2 %。行动是字符向量的单元格数组:
StepsS2。行动= {“跳”“运行”“蹲”“循环”“其他”};
使用()进行索引并使用'=='进行比较将抛出错误。
StepsS2.Action (1) = =“跳”
%错误:对于'cell'类型的操作数,不支持操作符'=='。万博1manbetx
%索引使用{}和比较使用'=='将生成一个逻辑
% vector,但仅在大小匹配的情况下。
StepsS2。行动{1} ==“跳”% Output = [1 1 1 1]
StepsS2。行动{1} ==“运行”
%错误:数组的大小与此操作不兼容。
您需要的是使用'strcmp'或'isequal'进行比较
比较字符串(StepsS2.Action (1),“跳”%输出= true
比较字符串(StepsS2。{1},“跳”%输出= true
如果不是 StepsS2。行动 是一个字符串向量,你要做的是可行的。
方法可以将字符向量的单元格数组转换为字符串 字符串 命令。
如果StepsS2 %。行动是字符向量的单元格数组:
StepsS2。行动= [“跳”“运行”“蹲”“循环”“其他”];
%使用()进行索引和使用'=='进行比较将正常工作。
StepsS2.Action (1) = =“跳”%输出= true
%索引使用{}和比较使用'=='将生成一个逻辑
% vector,但仅在大小匹配的情况下。
StepsS2。行动{1} ==“跳”% Output = [1 1 1 1]
StepsS2。行动{1} ==“运行”
%错误:数组的大小与此操作不兼容。
您也可以使用'strcmp'或'isequal'
比较字符串(StepsS2.Action (1),“跳”%输出= true
比较字符串(StepsS2。{1},“跳”%输出= true
另一个完全不同的选项是设置 FaceColor 财产 “平” 然后使用 CData 属性。该示例还展示了如何使用 开关 去做你想做的事。例如:
时间=小时(1:15)';
步骤=兰迪(1)100年,15日;
行动= [“跳”“运行”“蹲”“循环”“其他”];
Action =操作(randi(1) 5, 15日);
StepsS2 =表(时间,步骤,行动);
(StepsS2 b =酒吧。时间,StepsS2.Steps);
b.FaceColor =“平”
i = 1:长度(StepsS2.Time)
开关StepsS2.Action(我)
情况下“跳”
b.CData(i,:) = [1 0 0];
情况下“运行”
b.CData(i,:) = [1 1 0];
情况下“蹲”
b.CData(i,:) = [0 1 1];
情况下“循环”
b.CData(i,:) = [0 0 1];
否则
b.CData(i,:) = [0 1 0];
结束
结束
8的评论
dpb
dpb 2021年7月9日
作为背景,这只是2017年之前的其中一个;早在2014年就有答案了;如果去谷歌组,在“cssm”新闻组档案下搜索,它会回到他们的档案,可能…
2014年的一篇已经指出,bar标签应该是bar的内置可写属性,不需要这样的设计,尽管我提交了增强请求,b-^h^h抱怨bar(),并建议这样的做法可以追溯到很久很久以前的MATLAB早期。然后,在2000年左右,他没有通过咨询公司,而是大量地开始自学MATLAB,并再次开始讨伐,直到最后放弃,因为这是注定要失败的……

登录发表评论。

更多的答案(0)

s manbetx 845


释放

R2020a

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!