Matlab中能否使标记尺寸与坐标轴成比例?(地图绘图场景)
问题解答
直接用MarkerSize参数没法实现你的需求——因为MarkerSize的单位是点(Point),1点约等于1/72英寸,它是和图窗的画布尺寸绑定的,和坐标轴的数据单位(米)没有直接关联。
要让标记大小和坐标轴的米单位成比例,推荐用以下两种方法:
方法1:用rectangle绘制自定义尺寸标记
rectangle函数可以直接用数据单位指定宽高,是最可靠的方案。比如你要在(x0,y0)位置画一个10米宽、50米高的标记:
% 示例点坐标 x0 = 250; y0 = 250; % 标记的尺寸(米) marker_width = 10; marker_height = 50; % 绘制中心对齐的矩形标记 rectangle(... 'Position', [x0 - marker_width/2, y0 - marker_height/2, marker_width, marker_height], ... 'FaceColor', 'red', ... 'EdgeColor', 'black', ... 'LineWidth', 1); % 设置坐标轴范围 axis([0 500 0 500]); xlabel('X (米)'); ylabel('Y (米)');
不管你怎么缩放坐标轴,这个矩形的实际数据尺寸始终是10×50米,完全符合你的要求。如果需要圆形标记,可以给rectangle添加Curvature参数并设为[1 1],就能得到对应尺寸的椭圆(x/y轴范围相同时就是正圆)。
方法2:用scatter结合坐标换算(需手动维护)
如果一定要用scatter这类标记函数,需要把数据单位的尺寸换算成MarkerSize对应的点单位,但这个方法的缺陷是:坐标轴缩放后标记大小会失效,需要手动更新。
示例代码:
x = 250; y = 250; axis_lim = [0 500 0 500]; axis(axis_lim); fig = gcf; ax = gca; % 获取坐标轴的像素尺寸 ax_pos = ax.Position; fig_width_pix = fig.Position(3); fig_height_pix = fig.Position(4); ax_width_pix = ax_pos(3) * fig_width_pix; ax_height_pix = ax_pos(4) * fig_height_pix; % 计算米和像素的换算比例 x_range = diff(axis_lim(1:2)); % 500米 y_range = diff(axis_lim(3:4)); % 500米 pix_per_m_x = ax_width_pix / x_range; pix_per_m_y = ax_height_pix / y_range; % 把10米宽换算成点单位(1点=72/DPI像素,默认DPI=96) marker_width_pix = 10 * pix_per_m_x; marker_size = marker_width_pix * 72 / fig.DPI; % scatter的SizeData是标记的面积,所以用平方值 scatter(x, y, marker_size^2, 'filled', 'Marker', 's');
如果需要坐标轴缩放后标记大小自动更新,你可以给坐标轴添加SizeChangedFcn回调函数,每次缩放时重新计算MarkerSize。
内容的提问来源于stack exchange,提问作者Maite Martinez
相关产品推荐
相关产品推荐

