MATLAB能否在不修改数据的情况下实现3D坐标轴断裂?
MATLAB 3D图实现坐标轴断裂(无需修改数据)
你需要在3D图中实现坐标轴断裂,且不想修改原始数据,试过2D的breakxaxis、breakyaxis但它们只支持二维坐标系。这里可以通过子图拼接模拟断轴的方式实现,以下是针对你提供的椭球绘图代码的完整解决方案:
首先指出你代码里的一个小问题:计算第二个椭球的特征值时,你误写了eig(shape_matrix_1),应该改成eig(shape_matrix_2),否则两个椭球的形状会完全一致。
实现步骤与代码
核心思路是把两个关注的x轴区域(95-110、500-515)分别放在两个并排的子图中,隐藏中间的冗余轴元素,添加断轴标记,让整体看起来是一个断裂的3D坐标轴。
clear; close; clc; % ---------------------- 原始数据准备(修正了特征值计算的错误) ---------------------- center_1=[500;500;510]; shape_matrix_1=[1.0 0.5 0.3; 0.3 1 0.2; 0.4 0.5 1.3]; [V_1, D_1] = eig(shape_matrix_1); numPoints = 20; [x_1, y_1, z_1] = ellipsoid(center_1(1), center_1(2), center_1(3), ... sqrt(D_1(1,1)), sqrt(D_1(2,2)), sqrt(D_1(3,3)), numPoints); center_2=[100;105;110]; shape_matrix_2=[1.0 0.5 0.3; 0.3 1 0.4; 0.4 0.5 1.3]; [V_2, D_2] = eig(shape_matrix_2); % 修正此处的shape_matrix_1为shape_matrix_2 [x_2, y_2, z_2] = ellipsoid(center_2(1), center_2(2), center_2(3), ... sqrt(D_2(1,1)), sqrt(D_2(2,2)), sqrt(D_2(3,3)), numPoints); % ---------------------- 创建两个并排子图模拟断轴 ---------------------- figure('Position', [100, 100, 1000, 600]); % 设置窗口大小 % 第一个子图:显示x轴95-110区域 ax1 = subplot(1,2,1); surf(x_1, y_1, z_1, 'FaceAlpha', 0.3); hold on; surf(x_2, y_2, z_2, 'FaceAlpha', 0.3); xlim([95, 110]); ylim([min([y_1(:); y_2(:)])-5, max([y_1(:); y_2(:)])+5]); % 统一y轴范围 zlim([min([z_1(:); z_2(:)])-5, max([z_1(:); z_2(:)])+5]); % 统一z轴范围 box on; set(ax1, 'XTick', [95, 100, 110]); % 设置x轴刻度 % 隐藏右侧的y轴和z轴标签、刻度,避免重复 set(ax1, 'YTickLabel', [], 'ZTickLabel', [], 'YColor', 'none', 'ZColor', 'none'); % 第二个子图:显示x轴500-515区域 ax2 = subplot(1,2,2); surf(x_1, y_1, z_1, 'FaceAlpha', 0.3); hold on; surf(x_2, y_2, z_2, 'FaceAlpha', 0.3); xlim([500, 515]); ylim(get(ax1, 'YLim')); % 和第一个子图y轴范围一致 zlim(get(ax1, 'ZLim')); % 和第一个子图z轴范围一致 box on; set(ax2, 'XTick', [500, 505, 515]); % 设置x轴刻度 % 隐藏左侧的y轴和z轴标签、刻度 set(ax2, 'YTickLabel', [], 'ZTickLabel', [], 'YColor', 'none', 'ZColor', 'none'); % ---------------------- 添加断轴标记 ---------------------- % 获取两个子图的位置信息 pos1 = get(ax1, 'Position'); pos2 = get(ax2, 'Position'); % 在两个子图之间绘制断轴斜线(模拟断裂效果) annotation('line', [pos1(1)+pos1(3), pos2(1)], [pos1(2)+pos1(4)*0.2, pos2(2)+pos2(4)*0.2], 'Color', 'k', 'LineWidth', 1.5); annotation('line', [pos1(1)+pos1(3), pos2(1)], [pos1(2)+pos1(4)*0.8, pos2(2)+pos2(4)*0.8], 'Color', 'k', 'LineWidth', 1.5); % 添加整体的y轴和z轴标签(放在中间位置) annotation('textbox', [0.02, 0.4, 0.05, 0.2], 'String', 'Y轴', 'EdgeColor', 'none', 'VerticalAlignment', 'middle', 'HorizontalAlignment', 'center'); annotation('textbox', [0.45, 0.02, 0.1, 0.05], 'String', 'Z轴', 'EdgeColor', 'none', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
效果说明
- 两个子图分别聚焦你关注的x轴区域,原始数据完全未修改;
- 通过隐藏中间重复的轴元素、添加断轴斜线,模拟出3D坐标轴断裂的视觉效果;
- 统一了y轴和z轴的范围,保证两个子图的显示连贯。
内容的提问来源于stack exchange,提问作者user24930120
相关产品推荐
相关产品推荐

