当我们有三个一维数组x,y,i,其中i表示强度(或者其它),用颜色深浅表示。现在我们需要实现以下需求:
- 使用一维数组
x
、y
、i
,其中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')
tricontourf
是matplotlib
中用于绘制三角网格等值线填充图的函数,适用于在不规则网格数据上生成等值线图。它用于填充等值线区域并使用颜色来表示值的变化。参数说明
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()
写在最后: 如果您觉得有用,还请点赞、收藏、关注!
标签:set,等值线图,一维,WorkFaceXY,zorder,数组,np,ax,array From: https://blog.csdn.net/m0_56230886/article/details/141685466