Matplotlib 3D散点图日期轴映射问题求助
解决方案:将3D散点图的整数刻度映射回日期标签
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np N = 1000 bm = pd.DataFrame( index=pd.bdate_range(start='2012-01-01', periods=N, freq='B'), data={x: np.random.randn(N) for x in range(1, 11)} ) # 生成零值并替换为NaN以隐藏这些点 bm = pd.DataFrame(index=bm.index, columns=bm.columns, data=np.where(np.abs(bm.values) < 0.02, 0, bm.values)) bm = bm.replace({0: np.nan}) # 保存原始日期列表,用于后续刻度映射 original_dates = bm.index.tolist() # 展开数据框,保留日期的整数位置关联 flat_bm = bm.unstack() x = flat_bm.index.get_level_values(0) y = flat_bm.index.get_level_values(1) z = flat_bm.values # 初始化3D绘图 fig = plt.figure(figsize=(15,10)) ax = plt.axes(projection='3d') # 绘制散点图 ax.scatter(x, y, z, '.', c=flat_bm.values, cmap='Reds') # 核心操作:将y轴整数刻度替换为对应日期 # 自定义刻度间隔(避免N过大时标签重叠,可根据需求调整) step = 50 valid_yticks = np.arange(0, len(original_dates), step) # 生成日期格式的刻度标签 ytick_labels = [date.strftime('%Y-%m-%d') for date in original_dates[::step]] # 设置y轴刻度与标签 ax.set_yticks(valid_yticks) ax.set_yticklabels(ytick_labels) # 优化标签显示:旋转避免重叠 ax.tick_params(axis='y', labelrotation=45) # 设置轴名称 ax.set_xlabel('Series') ax.set_ylabel('Date') ax.set_zlabel('Value') plt.show()
关键实现说明
- 保留日期映射:提前存储原始日期索引列表
original_dates,确保每个y轴整数位置都能对应到真实日期。 - 自定义刻度密度:通过
step参数控制显示的刻度数量,避免N过大时标签重叠(比如示例中每50个日期显示一个刻度)。 - 刻度替换逻辑:利用
set_yticks指定整数位置,再用set_yticklabels将这些位置替换为格式化后的日期字符串。
内容的提问来源于stack exchange,提问作者s5s
相关产品推荐
相关产品推荐

