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

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()

关键实现说明

  1. 保留日期映射:提前存储原始日期索引列表original_dates,确保每个y轴整数位置都能对应到真实日期。
  2. 自定义刻度密度:通过step参数控制显示的刻度数量,避免N过大时标签重叠(比如示例中每50个日期显示一个刻度)。
  3. 刻度替换逻辑:利用set_yticks指定整数位置,再用set_yticklabels将这些位置替换为格式化后的日期字符串。

内容的提问来源于stack exchange,提问作者s5s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:38:18