当前位置: 首页 > article >正文

仅利用一维数组实现等值线图效果(附完整代码)

当我们有三个一维数组x,y,i,其中i表示强度(或者其它),用颜色深浅表示。现在我们需要实现以下需求:

  • 使用一维数组 xyi,其中 i 用于表示颜色深浅。
  • 在三维坐标系中,图像位于指定的 z 轴位置(如 z=230)。
  • 生成的图像效果类似二维等值线图(Contour Plot)。

 那么效果类似怎样的呢?如下图所示:

 通常,当我们给出需求是,往往用以下代码:

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
z_value = 20  # 固定的 z 轴位置
i = np.sin(x) * np.cos(y)  # 示例数据,替换为实际的 i 数组
# 创建网格
X, Y = np.meshgrid(x, y)
# 转换 i 数组的形状,使其与 X, Y 的形状匹配
I = np.sin(X) * np.cos(Y)  # 这个只是为了示例,你应该用实际的 i 数组

这个代码存在什么问题呢?就是,我的i数组是已经有了的,不能通过x和y得到(或者得到的过程很复杂),当执行X, Y = np.meshgrid(x, y)这行代码时,x,y数组变成二维数组,而我们的i由于不能通过x,y得到,因此i还是一维数组。那么在接下来的绘图时,将会由于数组不匹配而报错。

那么,如何实现仅使用一维数组绘制等值线图效果呢?

好,现在,给出实现该效果的核心代码语句:

contour = ax.tricontourf(x, y, i, zdir='z', offset=z_position, cmap='viridis')

tricontourfmatplotlib 中用于绘制三角网格等值线填充图的函数,适用于在不规则网格数据上生成等值线图。它用于填充等值线区域并使用颜色来表示值的变化。

参数说明

  • x, y: 一维数组,代表点的坐标。
  • z: 一维数组,代表每个点的值,用于绘制等值线。
  • levels: 可选,指定等值线的级别或数量。可以是一个整数(表示级别数量)或者一个数组(表示具体的等值线值)。
  • cmap: 可选,指定颜色映射。'viridis' 是一个例子,你也可以使用其他 matplotlib 提供的色图,如 'plasma', 'inferno', 'magma' 等。
  • **kwargs: 其他关键字参数,例如 alpha(透明度)、extend(是否延伸等值线)等。

 示例

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 示例数据
x = np.random.rand(100) * 10  # x 一维数组
y = np.random.rand(100) * 10  # y 一维数组
i = np.random.rand(100)       # i 一维数组,作为颜色深浅的表示

# 指定 z 轴位置
z_position = 20

# 创建图形和 3D 坐标轴
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 绘制等值线图效果
contour = ax.tricontourf(x, y, i, zdir='z', offset=z_position, cmap='viridis')

# 添加颜色条
cbar = plt.colorbar(contour)
cbar.set_label('Intensity')

# 设置坐标轴标签
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

# 设置 z 轴的固定位置
ax.set_zlim(z_position - 5, z_position + 5)  # 增加范围以便观察

plt.show()

当然了,在你学习完这个算法后,实现上述需求轻而易举。接着,我们只需要继续添加元素,即可实现文中给出的图片效果。由于图片的实现涉及到私密数据,因此就不给出图片涉及到的数据了。

下面,给出完整代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy.special as sp

X0, Y0, D_los_true, D_los = xx, xx, xx, xx  # 替换成你的数据

# 指定 z 轴位置
z_position = 230

# 图形参数
c = 230
a = c
p = 0
q = 60.154

WorkFaceXY_UP = np.array([[1026.23083792, 555.63189845, c], [740.5642812, 451.65777488, c], [551.76916208, 970.36810155, c],
                          [837.4357188, 1074.34222512, c], [1026.23083792, 555.63189845, c]])
WorkFaceXY_TRUE = np.array([[1026.23083792, 555.63189845, p], [740.5642812, 451.65777488, p], [551.76916208, 970.36810155, p],
                           [837.4357188, 1074.34222512, p], [1026.23083792, 555.63189845, p]])
WorkFaceCenter_TRUE = np.array([[798, 763, p]])

WorkFaceXY_DOWN = np.array([[1002.0931283, 556.18790041, -c], [740.89328999, 477.32701977, -c], [580.8988717, 1007.25409959, -c],
                            [842.09871001, 1086.11498023, -c], [1002.0931283, 556.18790041, -c]])
WorkFaceXY_FANYAN = np.array([[1002.0931283, 556.18790041, q], [740.89328999, 477.32701977, q], [580.8988717, 1007.25409959, q],
                             [842.09871001, 1086.11498023, q], [1002.0931283, 556.18790041, q]])
WorkFaceCenter_FANYAN = np.array([[791.496, 781.721, q]])

# 线
Line1 = np.array([[1026.23083792, 555.63189845, p], [1026.23083792, 555.63189845, c]])
Line2 = np.array([[740.5642812, 451.65777488, p], [740.5642812, 451.65777488, c]])
Line3 = np.array([[551.76916208, 970.36810155, p], [551.76916208, 970.36810155, c]])
Line4 = np.array([[837.4357188, 1074.34222512, p], [837.4357188, 1074.34222512, c]])
Line0 = np.array([[798, 763, p], [798, 763, c]])
# 线
Line10 = np.array([[1002.0931283, 556.18790041, q], [1002.0931283, 556.18790041, -c]])
Line20 = np.array([[740.89328999, 477.32701977, q], [740.89328999, 477.32701977, -c]])
Line30 = np.array([[580.8988717, 1007.25409959, q], [580.8988717, 1007.25409959, -c]])
Line40 = np.array([[842.09871001, 1086.11498023, q], [842.09871001, 1086.11498023, -c]])
Line00 = np.array([[791.496, 781.721, q], [791.496, 781.721, -c]])

# 创建图形和 3D 坐标轴
fig = plt.figure(figsize=(20, 15))
ax = fig.add_subplot(111, projection='3d')

# 绘制连线
ax.plot(Line0[:, 0], Line0[:, 1], Line0[:, 2], 'r--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line1[:, 0], Line1[:, 1], Line1[:, 2], 'r--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line2[:, 0], Line2[:, 1], Line2[:, 2], 'r--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line3[:, 0], Line3[:, 1], Line3[:, 2], 'r--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line4[:, 0], Line4[:, 1], Line4[:, 2], 'r--', zorder=5, linewidth=2, alpha=0.7)
# 绘制连线
ax.plot(Line00[:, 0], Line00[:, 1], Line00[:, 2], 'k--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line10[:, 0], Line10[:, 1], Line10[:, 2], 'k--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line20[:, 0], Line20[:, 1], Line20[:, 2], 'k--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line30[:, 0], Line30[:, 1], Line30[:, 2], 'k--', zorder=5, linewidth=2, alpha=0.7)
ax.plot(Line40[:, 0], Line40[:, 1], Line40[:, 2], 'k--', zorder=5, linewidth=2, alpha=0.7)
# 绘制中心点
ax.scatter(WorkFaceCenter_TRUE[:, 0], WorkFaceCenter_TRUE[:, 1], WorkFaceCenter_TRUE[:, 2],
           c='r', marker='o', s=90, zorder=20)
ax.scatter(WorkFaceCenter_FANYAN[:, 0], WorkFaceCenter_FANYAN[:, 1], WorkFaceCenter_FANYAN[:, 2],
           c='k', marker='o', s=90, zorder=20)
# 绘制投影面
ax.plot(WorkFaceXY_UP[:, 0], WorkFaceXY_UP[:, 1], WorkFaceXY_UP[:, 2], label='Line', linewidth=3, c='r', zorder=20)
ax.plot(WorkFaceXY_DOWN[:, 0], WorkFaceXY_DOWN[:, 1], WorkFaceXY_DOWN[:, 2], label='Line', linewidth=3, c='k', zorder=20)
# 绘制真实面
ax.plot(WorkFaceXY_TRUE[:, 0], WorkFaceXY_TRUE[:, 1], WorkFaceXY_TRUE[:, 2], label='Line', linewidth=3, c='r', zorder=20)
ax.plot(WorkFaceXY_FANYAN[:, 0], WorkFaceXY_FANYAN[:, 1], WorkFaceXY_FANYAN[:, 2], label='Line', linewidth=3, c='k', zorder=20)

# 绘制等值线图效果
contour_true = ax.tricontourf(X0, Y0, D_los_true, zdir='z', offset=z_position, cmap='RdYlBu')
contour = ax.tricontourf(X0, Y0, D_los, zdir='z', offset=-z_position, cmap='RdYlBu')

# 添加颜色条
cbar = plt.colorbar(contour)
cbar.set_label('mm', fontsize=30)  # 颜色条标签字体大小
cbar.ax.tick_params(labelsize=30)  # 颜色条刻度数字字体大小
cbar.ax.set_position([0.78, 0.2, 0.03, 0.5])  # [left, bottom, width, height]
cbar1 = plt.colorbar(contour_true)
cbar1.set_label('mm', fontsize=30)  # 颜色条标签字体大小
cbar1.ax.tick_params(labelsize=30)  # 颜色条刻度数字字体大小
cbar1.ax.set_position([0.65, 0.2, 0.03, 0.5])  # [left, bottom, width, height]

# 设置坐标轴标签
ax.set_xlabel('North/m', fontsize=30, labelpad=35)
ax.set_ylabel('East/m', fontsize=30, labelpad=35)
z_label = ax.set_zlabel('H/m', fontsize=30, labelpad=35)
z_label.set_rotation(90)  # 逆时针旋转 90 度

# 设置坐标轴刻度数字大小
ax.tick_params(axis='x', labelsize=30, pad=10)
ax.tick_params(axis='y', labelsize=30, pad=10)
ax.tick_params(axis='z', labelsize=30, pad=20)

# 设置 z 轴的固定位置
ax.set_zlim(-z_position, z_position)
ax.grid(False)
# 设置视角
ax.view_init(elev=25., azim=45)
plt.savefig('D:\\CUMT_综合文档\\奖励\\论文\\DaiMa\\Data\\UPandDown_TRUE_image_2.png')
plt.show()

写在最后: 如果您觉得有用,还请点赞、收藏、关注!


http://www.kler.cn/a/282090.html

相关文章:

  • 分布式cap理论学习
  • Python数据分析NumPy和pandas(三十五、时间序列数据基础)
  • 9.C++面向对象6(实现一个较为完善的日期类)
  • 储能技术中锂离子电池的优势和劣势
  • UNI-APP小程序答题功能开发(左右滑动,判断,填空,问答,答题卡,纠错,做题倒计时等)
  • C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中
  • TeamTalk消息服务器学习
  • Nuxt3入门:介绍、项目安装和了解视图(第一节)
  • 【Android】Glide模块工作原理
  • 2024最全网络安全工程师面试题(附答案),金九银十找工作必看!
  • CARLA Drone: 首个实现从不同空中视角进行单目3D目标检测,并提供数据集
  • 保证MQ的高可用性:RabbitMQ为例
  • 后端开发刷题 | 面试篇4
  • 合合信息acge模型获C-MTEB第一,文本向量化迎来新突破
  • Git 的基本使用
  • 【js】箭头函数和普通函数在this指向的区别
  • 深入理解DPO(Direct Preference Optimization)算法
  • MATLAB发票识别系统
  • 【Material-UI】Rating组件中的Rating precision属性
  • 31套科技风PPT模版免费下载
  • 电商云账户:空中分账场景的优势探索
  • [动态规划]---背包问题
  • 七、Centos安装LDAP--Docker版--已失败
  • gm8775转换ic
  • CSS基础 什么是盒模型
  • Vue3源码调试-第三篇