如何在Python 3D直方图的“壁”上绘制等高线并优化可读性
热波事件时空演化可视化优化需求
背景与定义
需可视化热波事件的时空演化:热波定义为日温高于阈值,强度为实测温度与阈值的差值。
预处理流程
通过脚本计算热波像素的时空连通性,采用聚类方法分离热波事件,保存各事件的经度、纬度、时间、强度文本文件。
当前实现
使用Python代码绘制4D热波事件的3D直方图,修改后的代码示例如下:
import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import LongitudeFormatter, LatitudeFormatter longitude = np.array([-9.4, -9.4, -9.4, -9.3, -9.3, -9.3]) latitude = np.array([38.8, 38.9, 39.0, 38.7, 38.8, 38.9]) z = np.array([1, 1, 1, 2, 2, 2]) intensity = np.array([1.0082481938068, 1.0974287307475, 1.115724032552, 1.4837606317027, 1.3200661292037, 1.2509449282401]) # 设置柱状图的位置与尺寸 dx = dy = 1 # 柱状图的宽度与深度 dz = 1 # 柱状图的高度 # 初始化3D绘图 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制3D柱状图 ax.bar3d(longitude, latitude, z + 5, dx, dy, dz, color=plt.cm.Reds(intensity / np.max(intensity))) # 设置网格线为虚线样式 ax.xaxis._axinfo['grid'].update(linestyle="--") ax.yaxis._axinfo['grid'].update(linestyle="--") ax.zaxis._axinfo['grid'].update(linestyle="--") # 设置z轴刻度与标签 z_ticks = np.arange(5, 35, 5) # 每5天设置一个刻度 z_labels = ['8月6日', '8月11日', '8月16日', '8月21日', '8月26日', '8月31日'] # 按时间顺序设置刻度标签 ax.set_zticks(z_ticks) ax.set_zticklabels(z_labels) # 设置坐标轴标签 ax.set_xlabel('经度') ax.set_ylabel('纬度') # ax.set_zlabel('日期') # 设置刻度标签对齐方式 ax.set_xticklabels(ax.get_xticks(), verticalalignment='baseline') ax.set_yticklabels(ax.get_yticks(), verticalalignment='baseline', horizontalalignment='left') # 调整刻度标签与坐标轴的间距 ax.tick_params(axis='x', pad=2.5) # 调整x轴标签间距 ax.tick_params(axis='y', pad=0.5) # 调整y轴标签间距 ax.tick_params(axis='z', pad=8) # 调整z轴标签间距 # 格式化经纬度标签 ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) # 添加颜色条 mappable = plt.cm.ScalarMappable(cmap=plt.cm.Reds) mappable.set_array(intensity) cbar = plt.colorbar(mappable, ax=ax, shrink=0.5, aspect=13) # 指定目标坐标轴 cbar.set_label('强度 (°C)') plt.show()
已生成对应可视化图,后续根据建议优化了图形雏形,但仍需改进。
问题需求
- 优化该3D直方图的可读性;
- 实现将图形投影到3D直方图的“壁”上,以提升z值的读取体验,曾尝试使用
contourf()但未成功。
内容的提问来源于stack exchange,提问作者Bastounator
相关产品推荐
相关产品推荐

