找文章 / 找答案
精选问答 更多内容

[Python独家资料] python绘制3D瀑布图

puffs 显示全部楼层 发表于 2024-9-20 13:49:50 |阅读模式 打印 上一主题 下一主题
成品:

代码:
  1. import matplotlib.pyplot as plt
  2. import matplotlib.ticker as ticker
  3. from mpl_toolkits.mplot3d.art3d import Poly3DCollection
  4. import numpy as np

  5. def line_3d(x, y, z, x_label_indexs):
  6.     """
  7.     在y轴的每个点,向x轴的方向延伸出一个折线面:展示每个变量的时序变化。
  8.     x: x轴,时间维,右边。
  9.     y: y轴,变量维,左边。
  10.     z: z轴,数值维。二维矩阵,y列x行。每一行是对应变量的一个时间序列。
  11.     x_label_indexs: 需要标注的时间点。
  12.     """
  13.     x_num = len(x)
  14.     y_num = len(y)
  15.     if z.shape[0] != y_num or z.shape[1] != x_num:
  16.         return -1

  17.     # 制作坐标格点(z中每个点对应的x、y坐标)
  18.     X, Y = np.meshgrid(x, y)

  19.     # 初始化
  20.     canvas = plt.figure()  # 创建画布
  21.     axs = canvas.add_subplot(111, projection='3d')  # 添加三维子图
  22.     # 若把111改成234,则意思是:创建一个2*3的网格,并在第4个格子中创建一个axes

  23.     # 绘制折线面
  24.     for i in range(y_num):  # 遍历
  25.         # z值线,即实际数据。
  26.         axs.plot(Y[i], X[i], z[i], color=plt.cm.viridis(i/y_num),
  27.                  linestyle='-', linewidth=1, marker='o', markersize=3, alpha=0.3)
  28.         # 0值线(z=0),与“地面”连接。
  29.         axs.plot(Y[i], X[i], np.zeros_like(z[i]), color='gray', alpha=0.5)

  30.         # 绘制有颜色的平面:本质是填充z值与0值之间的区域。
  31.         polygon = [
  32.             [Y[i, 0], X[i, 0], 0],    # 左下
  33.             [Y[i, -1], X[i, -1], 0],  # 右下
  34.         ]
  35.         for j in range(x_num-1, -1, -1):  # 依次添加点,使得polygon成为一个完整的闭合多边形
  36.             polygon.append([Y[i, j], X[i, j], z[i, j]])
  37.         axs.add_collection3d(Poly3DCollection([polygon], color=plt.cm.viridis(i/y_num), alpha=0.3))

  38.         # 标注数字(z值)
  39.         for k in x_label_indexs:
  40.             axs.text(Y[i, k]-0.05, X[i, k], z[i, k]+0.02, f'{z[i, k]:.2f}',
  41.                      color='black', ha='center', size=7)

  42.     # 用虚线将需要标注的时间(y)连起来
  43.     for k in x_label_indexs:
  44.         axs.plot(Y[:, k], X[:, k], z[:, k], linestyle='--', linewidth=0.8, color='gray')

  45.     axs.grid()
  46.     plt.show()


  47. if __name__ == '__main__':
  48.     x = np.arange(5)
  49.     time = np.arange(1, 15, 2)

  50.     z = np.array(
  51.         [
  52.             [0.20, 0.34, 0.38, 0.43, 0.44, 0.50, 0.61],
  53.             [0.21, 0.40, 0.38, 0.43, 0.60, 0.72, 0.75],
  54.             [0.22, 0.43, 0.44, 0.60, 0.77, 0.84, 0.92],
  55.             [0.23, 0.42, 0.44, 0.43, 0.64, 0.77, 0.86],
  56.             [0.38, 0.42, 0.43, 0.49, 0.55, 0.60, 0.81]
  57.         ]
  58.     )

  59.     line_3d(time, x, z, [1, 4, 6])
复制代码




回复

使用道具 举报

精彩评论2

时间和距离青铜三 显示全部楼层 发表于 2024-9-20 16:09:55
666
回复

使用道具 举报

happypanda铂金一 显示全部楼层 发表于 2024-9-22 08:31:34
回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 免费注册

  • 官方微信

    欢迎关注永洪服务号!收费为0,价值无限

    扫码关注
  • 新浪微博

    让每位用户轻松挖掘数据价值!

    访问新浪微博
  • 智能客服
50W

会员等你来哦

Copyright   ©2012-2024  北京永洪商智科技有限公司  (京ICP备12050607) 京公网安备110110802011451号 |《永洪社区协议》
返回顶部