You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:18:18