首页 > 其他分享 >仅利用一维数组实现等值线图效果(附完整代码)

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

时间:2024-08-29 21:23:04浏览次数:14  
标签:set 等值线图 一维 WorkFaceXY zorder 数组 np ax array

当我们有三个一维数组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()

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

标签:set,等值线图,一维,WorkFaceXY,zorder,数组,np,ax,array
From: https://blog.csdn.net/m0_56230886/article/details/141685466

相关文章

  • 代码随想录算法训练营,29日 | 704. 二分查找,27. 移除元素,977.有序数组的平方,209.长度最
    数组基础文档讲解︰代码随想录(programmercarl.com)1.连续空间、相同类型元素2.元素只能覆盖3.二维数组的地址连续吗(C++连续,Java不连续)704.二分查找题目链接:704.二分查找文档讲解︰代码随想录(programmercarl.com)视频讲解︰二分查找日期:2024-08-29思路:第一反应是想到二分查......
  • 求数组的最大值-Day2
    求数组[12,1,2,3000,130,31,12,200,500]最大值:声明并保存一个最大元素的变量max默认max取数组第一个元素遍历数组,将每个元素与max做大小比较如果该元素大于max,将这个元素存到max里,否则下一轮最后输出maxletarr=[12,1,2,3000,130,31,12,200,500]l......
  • c++数组挑战-字符环
    题目描述:有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串 ABCEFAGADEGKABUVKLM 的首尾连在一起,构成一个环;字符串 MADJKLUVKL 的首尾连在一起,构成一个另一个环; UVKLMA 是这两个环的一个连续公共字符串。时间限制:1 s内存限......
  • 代码随想录算法day2-数组2
    题目1209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=[2,......
  • C语言涉及问题(文件IO与数组和指针)
    一、文件IO相关1、标准出错、输入、输出三者的缓冲机制是什么?标准出错(stderr):属于不缓冲机制,数据直接写入设备标准输入(stdin)和标准输出(stdout):属于行缓冲和全缓冲,行缓冲时需要用'\n'分隔,全缓冲是缓冲区满才会写入或者输出。冲刷缓冲函数:fflush();无论是如果想将全缓冲......
  • 代码随想录算法训练营第四十三天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718.
    目录300.最长递增子序列 思路1.dp[i]的定义2.状态转移方程3.dp[i]的初始化4.确定遍历顺序 5.举例推导dp数组方法一:动态规划方法二:贪心心得收获 674.最长连续递增序列思路动态规划1.确定dp数组(dptable)以及下标的含义2.确定递推公式3.dp数组如何初始化4.......
  • 二维数组传参要点
    最近在写代码的时候又一次遇到了需要二维数组传参的操作,捣鼓了半天,总是会指针有问题,上网上查阅了相关资料后,虽然弄懂了,但是后面还是把二维改成一维了。但是呢?还是把相关的学习记录整理下来,以防后续还是需要用上。 这里主要以如何声明函数,如何调用函数,在函数中如何使用来讲解。形......
  • Java中的数组用法(复制、替换、查找与排序)
    在Java编程中,数组是一种基础且强大的数据结构,用于存储一组相同类型的元素。本文将深入探讨数组在Java中的用法,并展示如何进行数组的复制与替换、查找以及排序。(这些了解与学习只需要一个IDEA就可以进行练习了 )##数组的声明与初始化在Java中,数组的声明和初始化非常直观。以......
  • leetcode215. 数组中的第K个最大元素,小根堆/快排思想
    leetcode215.数组中的第K个最大元素给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2......
  • 3217. 从链表中移除在数组中存在的节点
    从链表中移除在数组中存在的节点给你一个整数数组nums和一个链表的头节点head。从链表中移除所有存在于nums中的节点后,返回修改后的链表的头节点。示例1:输入:nums=[1,2,3],head=[1,2,3,4,5]输出:[4,5]解释:移除数值为1,2和3的节点。示例2:输入:nums=[......