如何用Python/Matlab绘制以点大小表示第四维的4D散点图?
实现3轴+点大小表示第四维的4D可视化
Python 实现(Matplotlib)
利用matplotlib的3D散点图功能,通过scatter的s参数控制点的大小,直接映射面积数值。
示例代码
import matplotlib.pyplot as plt import numpy as np # 构造示例数据 years = np.array([2020, 2020, 2020, 2021, 2021, 2021, 2022, 2022, 2022]) regions = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) # 数字编码区域,后续可替换为标签 land_types = np.array([0, 0, 1, 1, 2, 2, 0, 1, 2]) # 数字编码土地覆盖类型 areas = np.array([120, 80, 200, 150, 90, 180, 130, 100, 220]) # 面积数值 # 缩放面积值到合适的点大小范围(避免点过大/过小) scaled_sizes = areas * 5 # 可根据实际数据调整缩放系数 # 创建3D绘图对象 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(projection='3d') # 绘制散点图,s参数对应面积 ax.scatter(years, regions, land_types, s=scaled_sizes, alpha=0.7) # 设置坐标轴标签 ax.set_xlabel('年份') ax.set_ylabel('区域') ax.set_zlabel('土地覆盖类型') # 替换坐标轴刻度为实际标签 ax.set_yticks([0, 1, 2]) ax.set_yticklabels(['区域A', '区域B', '区域C']) ax.set_zticks([0, 1, 2]) ax.set_zticklabels(['耕地', '林地', '草地']) # 手动创建图例说明点大小与面积的对应关系 from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], marker='o', color='C0', linestyle='', markersize=10, label='面积 100'), Line2D([0], [0], marker='o', color='C0', linestyle='', markersize=15, label='面积 150'), Line2D([0], [0], marker='o', color='C0', linestyle='', markersize=20, label='面积 200') ] ax.legend(handles=legend_elements, loc='upper left') plt.show()
关键说明
- 用数字对区域和土地覆盖类型编码,后续可通过
set_yticklabels/set_zticklabels替换为实际业务名称 scaled_sizes是对面积值的缩放,需根据你的实际数据范围调整,确保不同面积的点大小差异清晰可辨- 手动构建图例避免默认颜色图例的干扰,明确点大小对应的面积区间
Matlab 实现
使用Matlab的scatter3函数,通过MarkerSize参数控制点大小,直接映射面积数值。
示例代码
% 构造示例数据 years = [2020, 2020, 2020, 2021, 2021, 2021, 2022, 2022, 2022]; regions = [1, 2, 3, 1, 2, 3, 1, 2, 3]; % 数字编码区域 land_types = [1, 2, 3, 2, 3, 1, 1, 3, 2]; % 数字编码土地覆盖类型 areas = [120, 80, 200, 150, 90, 180, 130, 100, 220]; % 面积数值 % 缩放面积到合适的MarkerSize范围 scaled_sizes = areas * 0.3; % 调整系数适配Matlab的MarkerSize单位 % 创建3D绘图 figure('Position', [100, 100, 800, 600]) scatter3(years, regions, land_types, scaled_sizes, 'filled', 'Alpha', 0.7); % 设置坐标轴标签 xlabel('年份'); ylabel('区域'); zlabel('土地覆盖类型'); % 替换刻度为实际标签 set(gca, 'YTick', [1,2,3], 'YTickLabel', {'区域A', '区域B', '区域C'}); set(gca, 'ZTick', [1,2,3], 'ZTickLabel', {'耕地', '林地', '草地'}); % 添加图例说明点大小与面积的对应 legend_handles = [ scatter(NaN, NaN, 100*0.3, 'filled', 'DisplayName', '面积 100'); scatter(NaN, NaN, 150*0.3, 'filled', 'DisplayName', '面积 150'); scatter(NaN, NaN, 200*0.3, 'filled', 'DisplayName', '面积 200') ]; legend(legend_handles, 'Location', 'upperleft'); grid on; view(3);
关键说明
- Matlab的
MarkerSize单位与Python不同,需调整缩放系数让点大小显示合理 - 同样通过替换刻度标签将数字编码转为实际业务名称
- 用空的scatter对象构建图例,明确点大小对应的面积区间
内容的提问来源于stack exchange,提问作者Yowich
相关产品推荐
相关产品推荐

