Matlab分类数据与数值升序绘图异常问题排查及替代方案
问题原因与解决方法
异常原因
你写的代码里,x_sort = reordercats(x,n_sort)只是修改了分类变量x的类别显示顺序(也就是x轴的排列顺序),但x_sort变量本身的元素顺序还是原数据的["A";"B";"C";"D"]。当调用scatter(x_sort, y(n_sort))时,scatter会把x_sort的每个元素(A、B、C、D)对应到它们在新分类顺序里的位置,同时将y(n_sort)的数值依次分配给这四个元素,这就导致了y值和类别对应错位,出现顺序异常。
举个具体例子:x_sort的第一个元素是A,对应新分类顺序的第3位;第二个元素是B,对应第1位;第三个是C,对应第4位;第四个是D,对应第2位。而y(n_sort)是[0.5;2;5;7.8],这四个值会依次绑定到A、B、C、D上,最终呈现出的y值顺序就和预期完全相反了。
替代代码
方法1:直接生成排序后的分类变量
不用修改原分类变量的类别顺序,直接用排序后的类别字符串创建新的分类变量,确保y值和类别一一对应:
s = cellstr(["A";"B";"C";"D"]); % Original data y = [5; 0.5; 7.8; 2]; % Original data [~, n_sort] = sort(y); s_sorted = s(n_sort); % 排序后的类别字符串 y_sorted = y(n_sort); % 排序后的y值 x_sorted = categorical(s_sorted); % 类别顺序自动匹配排序后的字符串 scatter(x_sorted, y_sorted);
方法2:使用bar图(适合需要柱状可视化的场景)
bar图对分类变量的对应关系处理更直观,直接传入排序后的分类和y值即可:
s = cellstr(["A";"B";"C";"D"]); y = [5; 0.5; 7.8; 2]; [~, n_sort] = sort(y); x_sorted = categorical(s(n_sort)); bar(x_sorted, y(n_sort));
方法3:用数值索引替代分类变量,手动设置x轴标签
如果更习惯用数值型x轴,可以先绘制数值点,再替换x轴标签:
s = cellstr(["A";"B";"C";"D"]); y = [5; 0.5; 7.8; 2]; [~, n_sort] = sort(y); y_sorted = y(n_sort); s_sorted = s(n_sort); scatter(1:length(y_sorted), y_sorted); set(gca, 'XTick', 1:length(y_sorted), 'XTickLabel', s_sorted);
内容的提问来源于stack exchange,提问作者Lexus15
相关产品推荐
相关产品推荐

