python matplotlib 三维实体圆柱图

news2025/2/24 2:57:02
环境
python:python-3.12.0-amd64
包:
matplotlib 3.8.2
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.ticker as ticker


def map_rate(X: list, to_min: float, to_max: float) -> list:
    """区间映射

    Attribute:

    - X: 需要映射的列表
    - to_min: 要映射到的最小值
    - to_max: 要映射到的最大值
    """
    x_min = min(X)
    x_max = max(X)
    return list([int(round(to_min + ((to_max - to_min) / (x_max - x_min)) * (i - x_min), 1)) for i in X])


# rainbow色带
def rainbow(x):
    # rainbow色带
    data = [(125, 0, 255), (99, 0, 255), (80, 0, 255), (70, 0, 255), (60, 0, 255), (50, 0, 255), (40, 0, 255),
            (30, 0, 255), (20, 0, 255), (10, 0, 255), (4, 0, 255), (0, 2, 255), (0, 7, 255), (0, 11, 255), (0, 16, 255)
        , (0, 20, 255), (0, 25, 255), (0, 29, 255), (0, 34, 255), (0, 38, 255), (0, 43, 255), (0, 47, 255),
            (0, 52, 255), (0, 56, 255), (0, 61, 255), (0, 65, 255)
        , (0, 70, 255), (0, 74, 255), (0, 79, 255), (0, 83, 255), (0, 88, 255), (0, 92, 255), (0, 97, 255),
            (0, 101, 255), (0, 106, 255), (0, 110, 255), (0, 115, 255), (0, 119, 255)
        , (0, 124, 255), (0, 128, 255), (0, 133, 255), (0, 137, 255), (0, 142, 255), (0, 146, 255), (0, 151, 255),
            (0, 155, 255), (0, 160, 255), (0, 164, 255), (0, 169, 255), (0, 173, 255)
        , (0, 178, 255), (0, 182, 255), (0, 187, 255), (0, 191, 255), (0, 196, 255), (0, 200, 255), (0, 205, 255),
            (0, 209, 255), (0, 214, 255), (0, 218, 255), (0, 223, 255), (0, 227, 255)
        , (0, 232, 255), (0, 236, 255), (0, 241, 255), (0, 245, 255), (0, 250, 255), (0, 255, 255), (0, 255, 245),
            (0, 255, 236)
        , (0, 255, 226), (0, 255, 217), (0, 255, 208), (0, 255, 198), (0, 255, 189), (0, 255, 179)
        , (0, 255, 175), (0, 255, 165), (0, 255, 156), (0, 255, 146), (0, 255, 137), (0, 255, 128)
        , (0, 255, 118), (0, 255, 109), (0, 255, 99), (0, 255, 90), (0, 255, 76), (0, 255, 66)
        , (0, 255, 62), (0, 255, 57), (0, 255, 47), (0, 255, 38), (0, 255, 29), (0, 255, 19), (0, 255, 10)
        , (0, 255, 0), (7, 255, 0), (16, 255, 0), (25, 255, 0), (34, 255, 0), (43, 255, 0), (52, 255, 0), (61, 255, 0),
            (70, 255, 0), (79, 255, 0), (88, 255, 0), (97, 255, 0), (106, 255, 0), (115, 255, 0), (124, 255, 0),
            (133, 255, 0), (142, 255, 0), (151, 255, 0)
        , (160, 255, 0), (169, 255, 0), (178, 255, 0), (187, 255, 0), (200, 255, 0), (209, 255, 0), (218, 255, 0),
            (227, 255, 0), (236, 255, 0), (245, 255, 0), (254, 255, 0), (255, 252, 0), (255, 247, 0), (255, 243, 0)
        , (255, 238, 0), (255, 234, 0), (255, 229, 0), (255, 225, 0), (255, 220, 0), (255, 216, 0), (255, 211, 0),
            (255, 206, 0), (255, 202, 0), (255, 197, 0), (255, 193, 0), (255, 188, 0)
        , (255, 184, 0), (255, 179, 0), (255, 175, 0), (255, 170, 0), (255, 165, 0), (255, 161, 0), (255, 156, 0),
            (255, 152, 0), (255, 147, 0), (255, 143, 0), (255, 138, 0), (255, 134, 0)
        , (255, 129, 0), (255, 124, 0), (255, 120, 0), (255, 115, 0), (255, 111, 0), (255, 106, 0), (255, 102, 0),
            (255, 97, 0), (255, 93, 0), (255, 88, 0), (255, 83, 0), (255, 79, 0)
        , (255, 74, 0), (255, 70, 0), (255, 65, 0), (255, 61, 0), (255, 56, 0), (255, 52, 0), (255, 47, 0),
            (255, 42, 0), (255, 38, 0), (255, 33, 0), (255, 29, 0), (255, 24, 0), (255, 20, 0)]
    co = map_rate(x, 0, 175)
    return np.array(list(data[i] for i in co))


# 求中点
def midpoints(x):
    sl = ()
    for i in range(x.ndim):
        x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]]) / 2.0
        sl += np.index_exp[:]
    return x


# 归一化函数
def normalize(data):
    mx = np.max(data) * np.ones(data.shape)
    mn = np.min(data) * np.ones(data.shape)
    return (data - mn) / (mx - mn)


# 定义应力与半径的关系
def Mises(r):
    return np.round(r * 2, 2)  # 计算von mises应力,并保留小数点后两位


# 定义圆柱的参数
R = 9000  # 圆柱的半径
H = 10000  # 圆柱的高
# 网格点数量
nr = 19j  # 沿半径分几层
ntheta = 25j  # >=4
nh = 9j
# 转换坐标系,并求中点
r, theta, z = np.mgrid[0:R:nr, 0:np.pi * 2:ntheta, 0:H:nh]
x = r * np.cos(theta)
y = r * np.sin(theta)

rc, thetac, zc = midpoints(r), midpoints(theta), midpoints(z)

# 填充网格
a, b, c = rc.shape
rr = list(rc[:, 0, 0])
sphere = np.zeros((a, b, c)) == 0

# 设置颜色
hsv = np.zeros(sphere.shape + (3,))
r_color1 = rainbow(rr)
r_color2 = normalize(r_color1)
rgb_r = r_color2[:, 0]
rgb_g = r_color2[:, 1]
rgb_b = r_color2[:, 2]
for i in range(a):
    hsv[i, ..., 0] = rgb_r[i] * np.ones((b, c))
    hsv[i, ..., 1] = rgb_g[i] * np.ones((b, c))
    hsv[i, ..., 2] = rgb_b[i] * np.ones((b, c))

# 求应力
mises_r = np.linspace(0, R, a)
mises = Mises(mises_r)
# 画图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.voxels(x, y, z, sphere,
          facecolors=hsv,
          edgecolors=np.clip(2 * hsv - 0.5, 0, 1),
          linewidth=0.5)
ax.set_xlabel('mm')
ax.set_ylabel('mm')
ax.set_zlabel('mm')
# 画 colorbar
ax1 = fig.add_axes([0.02, 0.10, 0.03, 0.80])
cmap = mpl.cm.rainbow
norm = mpl.colors.Normalize(vmin=min(mises), vmax=max(mises))
cb = mpl.colorbar.ColorbarBase(ax1, cmap=cmap,
                               norm=norm,
                               orientation='vertical')

tick_locator = ticker.MaxNLocator(nbins=len(r))  # colorbar上的刻度值个数
cb.locator = tick_locator
cb.set_ticks(mises)
cb.update_ticks()
cb.set_label('von Mises')  # colorbar标签
plt.show()

注:

自定义颜色名称

'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r',
 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Grays', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r',
 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples',
 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r',
 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot',
 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm',
 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_grey', 'gist_heat',
 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gist_yerg', 'gnuplot', 'gnuplot2',
 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'grey', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral',
 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r',
 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r',
 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r' 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1478014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Restful风格解释

示例对比 传统风格开发 Restful风格开发 结论: 传统风格开发中,前端不同操作使用不同的url来访问后端,使得访问变得麻烦restful风格中,前端使用相同的url来访问后端,但是用数据传送方式进行区分(get为请求…

DataGrip2023配置连接Mssqlserver、Mysql、Oracle若干问题解决方案

1、Mssqlserver连接 本人连的是Sql2008,默认添加时,地址、端口、实例、账号、密码后,测试连接出现错误。 Use SSL:不要勾选 VM option:填写,"-Djdk.tls.disabledAlgorithmsSSLv3, RC4, DES, MD5withR…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步:下载log4net。 右键项目引用,进入管理NuGet包。 搜索log4net,下载安装。 第二步:创建LogHelper类。 public class LogHelper { private LogHelp…

说一说kong日志级别

Kong官网:The Platform Powering the API World | Kong Inc. Kong Gateway:Kong Gateway | Kong Docs Kong Admin API:Admin API - Kong Gateway - v3.4.x | Kong Docs Kong 企业版社区:API Community for Developers and Industr…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升,如何设置板框捕捉?_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例,如何精确的放置布局元器件?_哔哩哔哩_bilibili AD绘制PCB…

android游戏开发大全pdf,赶紧学起来

面经分享 第一部分是我前端面试的经验总结,第二部分是我认为比较有思考空间的题目 经验总结 一份漂亮的简历,需要包括以下部分(排版由上而下) 个人亮点(专精领域,个人博客,开源项目&#xff09…

jmeter 压测数据库

当前版本: jmeter 5.6.3mysql 5.7.39 简介 JMeter 是一个开源的 Java 应用程序,主要用于进行性能测试和负载测试。它支持多种协议,包括但不限于 HTTP、HTTPS、FTP、JDBC 以及各种 Web Services。对于数据库的压力测试可以使用 JDBC 协议与数…

Python算法题集_组合总和

Python算法题集_组合总和 题39:组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

【办公类-22-07】周计划系列(3-2)“信息窗+主题知识(优化)” (2024年调整版本)

作品展示: 背景需求 前文对“2023年2月”的一套信息窗主题知识的文件系列,进行第一次的提取。获得基础模板。 【办公类-22-07】周计划系列(3-1)“信息窗主题知识(提取)” (2024年调整版本&…

面试官问我Redis怎么测,我哪知道!

有些测试朋友来问我,redis要怎么测试?首先我们需要知道,redis是什么?它能做什么? redis是一个key-value类型的高速存储数据库。 redis常被用做:缓存、队列、发布订阅等。 所以,“redis要怎么测试…

理解计算着色器中glsl语言的内置变量

概要 本文通过示例的方式,着重解释以下几个内置变量: gl_WorkGroupSizegl_NumWorkGroupsgl_LocalInvocationIDgl_WorkGroupIDgl_GlobalInvocationID 基本概念 局部工作组与工作项 一个3x2x1的局部工作组示例如下,每个小篮格子表示一个工作项…

简单了解B树和B+树

目录 B树 B树 B树和B树的结构示意图 总结 B树和B树是两种非常重要的树状数据结构,它们广泛应用于数据库和文件系统的索引结构中。这两种数据结构能够帮助我们高效地管理、查询以及更新大量的数据。下面,我将简单介绍它们,以及他们之间的区别。 B树 B…

【leetcode】链表的中间节点

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 点击查看题目 思路: slow和fast都初始化为head,之后slow每走1步,fast走2步…

枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 (一、反倍数) (二、特别数的和) (三、找到最多的数) (四、小蓝的漆房) (五、小蓝和小桥的…

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会!天大的好消息,安心刷题了 46. 全排列 - 力扣(LeetCode) 回溯(排列) class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

一、前端开发

#视频链接:https://www.bilibili.com/video/BV1rT4y1v7uQ?p1&vd_source1717654b9cbbc6a773c2092070686a95 前端开发 前端开发1、快速开发网站2、浏览器能识别的标签2.1 编码(head)2.2 title(head)2.3 标题2.4 div和span练习题2.5 超链接…

如何做代币分析:以 USDT 币为例

作者:lesleyfootprint.network 编译:cicifootprint.network 数据源:USDT Token Dashboard (仅包括以太坊数据) 在加密货币和数字资产领域,代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…

prometheus监控带安全认证的elasticsearch

1.下载elasticsearch_exporter wget 下载二进制包并解压、运行: wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.lin…

imazing是啥 ?iMazing 3.0.0.3中文版会有哪些新功能?

imazing是啥 imazing是管理iOS设备的软件 iMazing 是一款用于管理iOS设备的软件。它支持在Windows和Mac电脑上对基于iOS系统的设备进行数据传输、备份和管理。用户可以通过这款软件传输和备份包括照片、音乐、铃声、视频、电子书及通讯录等多种信息。不仅限于iPhone、iPad或iP…

1、docker 基础命令

1、docker 运行镜像 docker run image tag 2、创建dockerfile&#xff08;构建容器的相关命令&#xff09; vim DockerFile 3、docker 构建容器镜像 docker build -t <image_name> . 4、docker 分层 5、查看镜像 docker images 6、docker 执行 docker run --name &…