多个legend以及标注部分图列构成多列图列

博客主要围绕Matlab展开,作者对比了Matlab7与Matlab6.5.1的区别,给出了绘图代码示例。代码中绘制了多个函数曲线,还涉及图例的设置和移动,不同版本在图例标记设置上略有不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

source: http://genial.yculblog.com/post-138255.html

山城棒棒儿军 @ 2004-08-22 16:02



Click to view in original size 498 x 396



这样成么?
不过就不能够有那个legend box了,否则很难看

最近再看matlab7,以及与matlab6.5.1区别,就这个程序而言也略有不同
代码都贴下面,这样画好后,只那个自己移动第二个legend ,第一是不可以移动的了
具体的还有待继续找找原因,我以前见过相关介绍的

代码:

t=0:pi/48:2*pi;
y1=sin(t);
y2=cos(t);
y3=y1.*y2;
y4=0.5*(y1+y2);
hold on
h1=plot(t,y1,'r-')
h11 = plot(t(1:10:end),y1(1:10:end),'*','MarkerFaceColor','r','MarkerEdgeColor
','r');
h2=plot(t,y2,'b-');
h22 = plot(t(1:10:end),y2(1:10:end),'.','MarkerFaceColor','b','MarkerEdgeColor
','b');
h3=plot(t,y3,'y');
h4=plot(t,y4,'g');
hold off
[legh,objh,outh,outm]=legend([h1,h2],'y1','y2',1);
legend boxoff

% matlab 6.5.1
set(objh(3),'marker','*');
set(objh(5),'marker','.');

% matlab7
%set(objh(4),'marker','*');
%set(objh(6),'marker','.');


legh2=copyobj(legh,gcf);
[legh2,objh2]=legend([h3,h4],'y3','y4',2);
legend boxoff

<think>我们假设Excel文件中有多组数据,每组数据包括一个“数字”列和一个“结论”列,现在有八组,也就是说有八对这样的列。同时,每组数据还有一个名字(即数据组的名称)。我们想要在同一张图中绘制这八组数据,每组数据用不同的颜色或标记区分,以便进行比较。文件结构示例(假设列的顺序为:数字1,结论1,数字2,结论2,...,数字8,结论8,以及可能包含的组名信息):-第一行可能是列标题,例如:'数字1','结论1','数字2','结论2',...,'数字8','结论8'-数据从第二行开始,每组数据有多行(但通常每组数据只有一行?)或者每组数据有多个数据点?根据问题描述,每组数据有多个点吗?但原问题描述是“数字1,结论1,数字2,结论2...”,这听起来像是每组只有一个数字和一个结论,那么八组就是八个点?但这样画图就是八个点,用散点图即可。然而,用户现在要求在同一图中绘制多组数据并进行比较,可能是多组数据(多列结论)与同一组数字(x轴)进行比较?或者每组数据都有自己的数字和结论,即八条不同的折线?重新理解问题:原问题描述是“数字1,结论1,数字2,结论2...直到第八组”,并且每组有名字。这里有两种可能:1.每一组只有一个数据点(即一个数字和一个结论),那么八组就是八个点,但这样在同一图中绘制多个点并没有“多组数据”需要同时绘制,因为只有一组(八个点)。2.另一种可能是,每组数据包含多个数据点(即多个数字和对应的多个结论),那么八组就是八条线(或八个散点序列)。然而,根据用户后续的问题补充:“我想在同一图表中绘制多组数据并进行比较”,以及引用中提到了散点图、折线图等,我们假设每组数据包含多个数据点(即多个x和y)。但原问题中Excel的结构描述并不清晰。考虑到用户之前的问题描述是“数字1,结论1,数字2,结论2...”,这更可能是指Excel表格中有8列(4对),每对两列(一列数字,一列结论),每组数据(即一对)有多个行(多个数据点)。或者,也可能是8行,每行代表一组,每组只有一个点?但这样画多组比较只需把八个点画在一张散点图上即可,但每组只有一个点,比较意义不大。因此,我们需要用户澄清,但根据当前信息,我假设两种情况:情况A:Excel表格中,每一行代表一个数据点,而列则按顺序排列:第一组数据的数字列、结论列,第二组数据的数字列、结论列,...,直到第八组。那么每组数据(即一对列)有多个行(即多个数据点)。例如,如果有n行,那么每组数据就有n个点。情况B:Excel表格中,每一列代表一组数据,其中第一列是数字(x值),后面八列是八组不同的结论(y值),即x是共享的,y有八组。但原问题描述是“数字1,结论1,数字2,结论2...”,这更符合情况A:即表格结构为:列1:组1的数字,列2:组1的结论,列3:组2的数字,列4:组2的结论,...,列15:组8的数字?列16:组8的结论?这样有16列。然而,用户还提到“每组数据的名字”,可能每个组有一个名称(字符串),那么这些名字可能存储在哪里?可能在第一行(作为列标题的一部分),也可能在单独的一列。为了通用性,我假设:-Excel文件的第一行是列标题,格式可能是:'组1_数字','组1_结论','组2_数字','组2_结论',...,'组8_结论'-或者,组名可能放在某个地方,比如单独的一行或一列。由于问题描述不够详细,我将提供两种常见情况的解决方案:情况1:共享x轴(即所有组使用相同的x值,比如相同的自变量),那么每组只需要一列y值(结论)。此时表格结构可能是:x列,结论1列,结论2列,...,结论8列情况2:每组有自己独立的x和y(数字和结论),那么表格结构是:组1_x,组1_y,组2_x,组2_y,...,组8_x,组8_y另外,每组数据的名字,我们假设列标题中包含了组名,例如“组1_数字”中的“组1”就是组名。下面分别处理两种情况:###情况1:共享x轴(每组有相同的x,不同的y)步骤:1.导入Excel数据2.提取x列(假设是第一列)3.提取八组结论列(第2列到第9列,假设有8组结论)4.绘制折线图或散点图,用不同颜色区分代码示例:```matlab%导入数据,假设文件名为data.xlsx,第一行为列标题data=readtable('data.xlsx');%提取x列(假设x列是第一列,列标题为'x')x=data.x;%或者data{:,1}%提取八组结论列(假设列标题为'结论1','结论2',...,'结论8')%注意:这里假设列标题的命名规则,实际可能需要调整y_columns=data(:,2:9);%假设第2到第9列是八组结论%或者通过列标题包含特定字符串来选择,这里直接按列索引%获取组名:从列标题中提取groupNames=y_columns.Properties.VariableNames;%这是结论列的列名%绘制图形figure;holdon;%在同一图形上叠加绘图%循环绘制八组数据colors=lines(8);%使用lines颜色图,生成8种颜色fori=1:8y=y_columns{:,i};%提取第i组结论列plot(x,y,'o-','Color',colors(i,:),'LineWidth',1.5,'MarkerSize',6,'DisplayName',groupNames{i});endholdoff;xlabel('数字');ylabel('结论');title('多组数据比较');legend('show');%显示图例,图例名称为组名gridon;```###情况2:每组有独立的x和y(16列)步骤:1.导入数据2.提取每一组的x和y(第1列和第2列是第一组,第3列和第4列是第二组,...)3.循环绘制每一组代码示例:```matlab%导入数据data=readtable('data.xlsx');%假设列标题格式:'组1_数字','组1_结论','组2_数字','组2_结论',...%总列数为16列(8组,每组2列)%获取列标题colNames=data.Properties.VariableNames;%准备存储组名(从列标题中提取,假设组名在列标题中以下划线分隔,取前半部分)%注意:由于每组有两列,我们只取奇数列的列标题(即x列)来提取组名groupNames=cell(1,8);fori=1:8%第i组的数字列的列索引:2*i-1colName=colNames{2*i-1};%假设列标题格式为“组名_数字”,我们去掉“_数字”部分parts=strsplit(colName,'_');groupNames{i}=parts{1};%取组名end%绘制图形figure;holdon;colors=lines(8);fori=1:8%第i组数据的列索引:数字列在2*i-1,结论列在2*ix_col=2*i-1;y_col=2*i;x=data{:,x_col};y=data{:,y_col};plot(x,y,'o-','Color',colors(i,:),'LineWidth',1.5,'MarkerSize',6,'DisplayName',groupNames{i});endholdoff;xlabel('数字');ylabel('结论');title('多组数据比较');legend('show');gridon;```###注意事项:1.如果每组数据只有一个点(即每列只有一行数据),那么使用`plot`时应该只画点(去掉线,使用'o',不加'-')。2.如果数据量很大,散点图可能更合适,但这里每组数据点数量未知,所以使用带标记的折线图('o-')可以同时显示点和线。3.组名的提取依赖于列标题的命名规则,如果列标题没有组名,那么需要用户提供组名,或者用其他方式(比如在Excel中单独有一行组名)。如果用户的数据结构不是上述任何一种,可能需要调整。但基于问题描述,这是两种最可能的情况。另外,引用中提到了散点图(引用[1])和折线图(引用[4]),我们这里采用折线图(带标记)可以同时体现散点和趋势。如果用户希望使用散点图,可以将`plot`中的`'o-'`改为`'o'`,这样只画点不连线。最后,根据用户需求,x轴为数字,y轴为结论,我们已设置坐标轴标签。如果用户有更多组名信息存储在Excel的其他位置(比如单独的一列),则需要调整组名提取方式。由于用户没有提供具体的数据结构,以上代码可能需要根据实际情况微调。如果用户的数据结构不明确,建议先使用`head(data)`查看导入的表格结构,再调整列索引和组名提取方法。希望这个回答能帮助用户在同一图表中绘制并比较多组数据。</think>### 在MATLAB中绘制多组数据并进行比较 根据您的需求,我将提供两种主要方法在同一图表中可视化并比较多个数据组(多个结论列)。这些方法基于MATLAB强大的可视化功能,并参考了数据可视化最佳实践[^1][^4]。 #### 方法1:使用多曲线折线图(推荐用于趋势比较) ```matlab % 导入Excel数据 data = readtable('data.xlsx'); % 提取共享X轴(假设所有组使用相同的数字列) x = data.数字; % 或 data{:,1} % 提取多组结论列(假设有8个结论列) y_columns = {'结论1', '结论2', '结论3', '结论4', '结论5', '结论6', '结论7', '结论8'}; group_names = {'组1', '组2', '组3', '组4', '组5', '组6', '组7', '组8'}; % 创建图形 figure; hold on; % 启用叠加绘图模式 % 定义颜色和线型 colors = lines(8); % 生成8种区别色 line_styles = {'-', '--', ':', '-.', '-o', '--s', ':^', '-.d'}; % 循环绘制每组数据 for i = 1:8 y = data.(y_columns{i}); plot(x, y, ... 'LineStyle', line_styles{i}(1:min(2,length(line_styles{i}))), ... % 取前两个字符 'Color', colors(i,:), ... 'Marker', line_styles{i}(end), ... % 最后一个字符作为标记 'DisplayName', group_names{i}, ... 'LineWidth', 1.5); end % 添加图表元素 hold off; xlabel('数字'); ylabel('结论值'); title('多组数据趋势比较'); legend('Location', 'best'); % 自动选择最佳位置 grid on; % 设置坐标轴范围 xlim([min(x), max(x)]); ylim([min(min(data{:,2:end})), max(max(data{:,2:end}))]); ``` **关键特性**: - 使用不同颜色、线型和标记区分各组数据[^1] - 自动生成图例显示组名 - 共享X轴便于趋势比较 - 自适应坐标轴范围 #### 方法2:使用分组柱状图(推荐用于数值比较) ```matlab % 准备数据 y_matrix = [data.结论1, data.结论2, data.结论3, data.结论4, ... data.结论5, data.结论6, data.结论7, data.结论8]; % 创建分组柱状图 figure; b = bar(x, y_matrix, 'grouped'); set(gca, 'XTick', x); % 确保所有X刻度显示 % 设置每组柱状图颜色 colormap(parula(8)); % 使用parula色图 for i = 1:8 b(i).DisplayName = group_names{i}; end % 添加图表元素 xlabel('数字'); ylabel('结论值'); title('多组数据数值比较'); legend('Location', 'best'); grid on; % 添加数值标签(可选) for i = 1:numel(b) xtips = b(i).XEndPoints; ytips = b(i).YEndPoints; labels = string(round(b(i).YData, 2)); text(xtips, ytips, labels, ... 'HorizontalAlignment','center',... 'VerticalAlignment','bottom'); end ``` **关键特性**: - 直观比较相同X值下不同组的数值差异 - 自动颜色分配和图例生成 - 可选的数值标签增强可读性 - 适合精确数值比较场景[^3] #### 高级技巧:添加统计标注 ```matlab % 在折线图代码后添加统计标注 for i = 1:8 y = data.(y_columns{i}); % 标注最大值 [max_val, max_idx] = max(y); text(x(max_idx), max_val, sprintf('Max: %.2f', max_val), ... 'VerticalAlignment','bottom', 'Color', colors(i,:)); % 标注最小值 [min_val, min_idx] = min(y); text(x(min_idx), min_val, sprintf('Min: %.2f', min_val), ... 'VerticalAlignment','top', 'Color', colors(i,:)); end ``` #### 结果解读指南: 1. **趋势分析**:观察各曲线走向是否一致,判断组间相关性[^1] 2. **数值比较**:在相同X值处比较各柱高度,识别性能差异 3. **异常检测**:关注远离主趋势的点或异常高度的柱 4. **聚类分析**:观察颜色相近的曲线/柱是否表现相似 > **最佳实践建议**:当组数超过5组时,考虑: > - 使用交互式图例(`legend('Interpreter','none','Box','off')`) > - 添加数据光标(`datacursormode on`) > - 创建子图分组展示(`subplot(2,4,i)`)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值