如何绘制带网格与概率标注的波高-周期海浪概率散点图
海浪概率网格分布图绘制问题
我想用某特定地点1年的海浪记录数据库,基于有效波高(H13D)和有效波周期(TH13D)绘制带概率数值的颜色网格分布图。目前已成功画出等高线,但使用annotate函数标注数值时,因数量过多导致图表拥挤,无法制作出示例图那样带色标颜色的网格+概率数值的效果。
当前使用的代码如下:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # Chemin vers le fichier CSV file = 'Candhis_03404_2022_arch.csv' # Lecture du fichier CSV donnees = pd.read_csv(file, delimiter=';') donnees['H13D'] = donnees['H13D'].replace(999.999, pd.NA) donnees['TH13D'] = donnees['TH13D'].replace(999.999, pd.NA) donnees= donnees.dropna(subset=['H13D', 'TH13D']) H13D=donnees['H13D'] TH13D=donnees['TH13D'] data_croisement=pd.crosstab(H13D,TH13D,margins=False) total_occurences=np.sum(data_croisement.sum(axis=0)) prob_occurence_rows=(data_croisement/total_occurences)*100 H_values = np.sort(donnees['H13D'].unique()) T_values = np.sort(donnees['TH13D'].unique()) T, H = np.meshgrid(T_values, H_values) # Création du contour plot plt.figure(figsize=(10, 8)) contour = plt.contourf(T, H, prob_occurence_rows, cmap='coolwarm') plt.colorbar(contour, label='Probabilité d\'occurences(%)') plt.xlabel('Période significative (s)') plt.ylabel('Hauteur significative (m)') plt.title('Contour plot du tableau de contingence') """ for i in range(len(H_values)): for j in range(len(T_values)): plt.annotate(f'{prob_occurence_rows.iloc[i, j]}', xy=(T_values[j], H_values[i]), ha='center', va='center') """ plt.grid(True) plt.show()
解决方案
要实现带颜色网格和清晰概率标注的效果,可通过以下调整完成:
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取CSV文件 file = 'Candhis_03404_2022_arch.csv' donnees = pd.read_csv(file, delimiter=';') # 处理缺失值 donnees['H13D'] = donnees['H13D'].replace(999.999, pd.NA) donnees['TH13D'] = donnees['TH13D'].replace(999.999, pd.NA) donnees = donnees.dropna(subset=['H13D', 'TH13D']) # 计算交叉表和发生概率 data_croisement = pd.crosstab(donnees['H13D'], donnees['TH13D'], margins=False) total_occurences = data_croisement.sum().sum() prob_occurence = (data_croisement / total_occurences) * 100 # 获取网格坐标 H_values = np.sort(donnees['H13D'].unique()) T_values = np.sort(donnees['TH13D'].unique()) T, H = np.meshgrid(T_values, H_values) # 创建绘图 plt.figure(figsize=(12, 9)) # 绘制带白色网格线的颜色块,替代等高线 pcolor = plt.pcolormesh(T, H, prob_occurence, cmap='coolwarm', edgecolors='white', linewidth=0.5) plt.colorbar(pcolor, label='发生概率(%)') # 标注概率数值(仅标注大于阈值的数值,避免拥挤) threshold = 0.1 # 可根据数据密度调整 for i in range(len(H_values)): for j in range(len(T_values)): prob = prob_occurence.iloc[i, j] if prob > threshold: # 根据背景色动态调整文字颜色,提升可读性 text_color = 'white' if prob > prob_occurence.max()/2 else 'black' plt.annotate(f'{prob:.1f}', xy=(T_values[j], H_values[i]), ha='center', va='center', color=text_color, fontsize=8) plt.xlabel('有效波周期(s)') plt.ylabel('有效波高(m)') plt.title('海浪发生概率网格分布图') plt.tight_layout() plt.show()
关键调整说明
- 用
pcolormesh替代contourf:绘制带白色网格线的颜色块,完全匹配示例图的网格样式 - 阈值过滤标注:只显示概率大于设定值(如0.1%)的数值,解决标注拥挤问题,阈值可根据数据密度自行调整
- 动态文字颜色:根据单元格背景色深浅切换文字颜色,确保数值在任何颜色背景下都清晰可读
- 优化布局:调整图表尺寸、字体大小,用
tight_layout()自动适配元素位置
内容的提问来源于stack exchange,提问作者SALIC TOM
相关产品推荐
相关产品推荐

