如何在热力图数据空缺处添加交叉影线及解决xlsx读取报错
问题修复方案
1. 报错原因及修复
报错Error tokenizing data是因为你使用纯文本解析函数pd.read_csv()读取二进制格式的.xlsx文件,二者格式不兼容导致解析失败。
修复步骤:
- 先安装xlsx读取依赖:
pip install openpyxl - 把原代码中的文件读取逻辑替换为Excel专用读取函数
2. 完整可运行代码(适配目标热力图效果)
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] # 替换read_csv为read_excel,指定兼容xlsx的引擎 df = pd.read_excel('Events_in_Month_and_Year.xlsx', engine='openpyxl') # 生成透视表 pivoted = df.pivot_table(index='month', columns='year', aggfunc=len, fill_value=0) # 补全1975-2018所有年份列,缺失年份默认补0 full_years = range(1975, 2019) pivoted = pivoted.reindex(columns=full_years, fill_value=0) # 按指定月份顺序调整行顺序 pivoted = pivoted.loc[months] # 可替换为你自己的空值标记逻辑,示例为随机生成20个空值模拟数据空缺 for _ in range(20): pivoted.iloc[np.random.randint(0, len(pivoted)), np.random.randint(0, len(pivoted.columns))] = np.nan max_val = 3 # 固定色阶最大值为3,匹配数据取值1/2/3的规则,避免色阶偏移 ax = sns.heatmap(pivoted, cmap=plt.get_cmap('Greys', max_val + 1), vmin=-0.5, vmax=max_val + 0.5, cbar_kws={"ticks": range(0, max_val+1)}) # 空值显示交叉阴影 ax.patch.set_facecolor('white') ax.patch.set_edgecolor('black') ax.patch.set_hatch('xxxx') # 显示色阶边框 spines = ax.collections[0].colorbar.ax.spines for s in spines: spines[s].set_visible(True) plt.tight_layout() plt.show()
3. 效果适配说明
- 新增
reindex逻辑补全1975-2018所有年份,避免数据中缺失的年份不在横轴显示 - 固定色阶范围匹配1/2/3的取值规则,颜色显示更稳定
- 0值对应浅灰色空白效果,空值位置显示交叉阴影,和目标示例效果一致
内容的提问来源于stack exchange,提问作者Prater
相关产品推荐
相关产品推荐

