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

如何绘制带网格与概率标注的波高-周期海浪概率散点图

海浪概率网格分布图绘制问题

我想用某特定地点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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:04:51