python画图|中秋到了,尝试画个月亮(球体画法)

news2024/11/15 21:21:10

学习了一段时间的画图,已经掌握了一些3D图的画法,部分链接如下:

python画图|极坐标下的3D surface-CSDN博客

python画图|3D参数化图形输出-CSDN博客

我们今天尝试一下月亮的画法。

【1】官网教程

首先还是到达官网教程学习:

3D surface (solid color) — Matplotlib 3.9.2 documentation

这里只给出了球体的画法,因此我们要自己探索。

探索之前先对官网代码进行解读。

【2】代码解读

首先依然是matpl和numpy的引入:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

然后定义了要画图:

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3d图

之后定义了变量:

# Make data
u = np.linspace(0, 2 * np.pi, 100) #定义自变量
v = np.linspace(0, np.pi, 100) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

最后定义了图形类型并要求输出图形:

# Plot the surface
ax.plot_surface(x, y, z) #定义图形类型为surface

# Set an equal aspect ratio
ax.set_aspect('equal') #设置坐标比例

plt.show() #输出图形

至此完整的代码注释为:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3d图

# Make data
u = np.linspace(0, 2 * np.pi, 100) #定义自变量
v = np.linspace(0, np.pi, 100) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

# Plot the surface
ax.plot_surface(x, y, z) #定义图形类型为surface

# Set an equal aspect ratio
ax.set_aspect('equal') #设置坐标比例

plt.show() #输出图形

输出图形为:

图1

在代码中,np.ones()d的功能是输出全是1的矩阵,用下述代码进行测试:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3d图

# Make data
u = np.linspace(0, 2 * np.pi, 100) #定义自变量
v = np.linspace(0, np.pi, 100) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

print('np.size(u)=',np.size(u)) #输出np.size(u)的结果,也就是输出u的维度
print('np.ones(np.size(u))=\n',np.ones(np.size(u))) #按照u的维度输出全是1的一阶矩阵

此时的输出结果为:

np.size(u)= 100
np.ones(np.size(u))=
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1.]

【3】代码修改

月亮的颜色一般是渐变的,因此要设置颜色,首先尝试纯色设置,改变图形输出代码为:

# Plot the surface
ax.plot_surface(x, y, z,color='y') #定义图形类型为surface

输出结果为:

图2

可见这只是将球体变成黄色,没有渐变效果。

下一步尝试使用cmap来说设置颜色,之后有很好的实践效果,参考下述链接:

python画图|极坐标下的3D surface-CSDN博客

更具体的,追溯到官网链接:

https://matplotlib.org/stable/users/explain/colors/colormaps.html

为此改变图形输出代码为:

# Plot the surface
ax.plot_surface(x, y, z,cmap='binary') #定义图形类型为surface

此时的输出结果为:

图3

由图3可见,球体的颜色变成黑白渐变。

至此的完整代码为:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3d图

# Make data
u = np.linspace(0, 2 * np.pi, 100) #定义自变量
v = np.linspace(0, np.pi, 100) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

# Plot the surface
ax.plot_surface(x, y, z,cmap='binary') #定义图形类型为surface

# Set an equal aspect ratio
ax.set_aspect('equal') #设置坐标比例

plt.show() #输出图形

【4】代码改写

首先将ax.set_aspect('equal')改为注释,或者直接将其删除,输出结果为:‘

图4

可见球体略变,变成椭球体。 ax.set_aspect('equal')具有让各坐标轴按照相等的宽高比变化。

ax.set_aspect('equal')

恢复ax.set_aspect('equal'),修改Z的定义为:使其变量数增大一倍

z = 10 * np.outer(2*np.ones(np.size(u)), np.cos(v)) #定义因变量

同时把颜色改为纯色:

# Plot the surface
ax.plot_surface(x, y, z,color='w') #定义图形类型为surface

此时的输出结果为:

图5

由图5可见,变量个数对图形结果影响很大。这个椭球体已经不太像常规见到的月亮。

然后我们把自变量的个数改为1000,让图形细化,改后的变量定义为:

# Make data
u = np.linspace(0, 2 * np.pi, 1000) #定义自变量
v = np.linspace(0, np.pi, 1000) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

颜色设置也稍微修改一下:

# Plot the surface
ax.plot_surface(x, y, z,cmap='Wistia') #定义图形类型为surface

此时的输出结果为:

图6

图6好像是一个熟透的月饼做的月亮。

至此的完整代码为:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

fig = plt.figure() #定义要画图
ax = fig.add_subplot(projection='3d') #定义要画3d图

# Make data
u = np.linspace(0, 2 * np.pi, 1000) #定义自变量
v = np.linspace(0, np.pi, 1000) #定义自变量
x = 10 * np.outer(np.cos(u), np.sin(v)) #定义因变量
y = 10 * np.outer(np.sin(u), np.sin(v)) #定义因变量
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) #定义因变量

# Plot the surface
ax.plot_surface(x, y, z,cmap='Wistia') #定义图形类型为surface

# Set an equal aspect ratio
ax.set_aspect('equal') #设置坐标比例

plt.show() #输出图形

【5】总结

本文学习了球体(月亮)的基本画法,尝试修改了颜色、坐标轴纵横比和自变量密度。

 

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

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

相关文章

java: 警告: 源发行版 17 需要目标发行版 17(100% 解决)

1. 问题说明 Idea启动Springboot服务报错:java: 警告: 源发行版 17 需要目标发行版 17 2. 解决方案 Project Structure指定jdk版本为我们当前使用的版本; Java Compiler指定jdk为我们当前使用的版本; Invalidate Caches重启Idea。 如果还…

NTC温度电阻--100K 10K

100K温度电阻分度表 粗精度直接用公式计算 细精度用厂家的传感器参数来计算 Y C1 C2* y C3 * y * y*y static float get_ntc_temp(double Rt) { double y log(Rt);//122.6us48M double val; static const double c1 0.0008314; static const double c2 0.00026178;…

Linux下vscode配置C++和python编译调试环境

Visual Studio Code (简称 VSCode) 是由微软开发的一款免费、开源、跨平台的代码编辑器。它支持 Windows、macOS 和 Linux 操作系统,并且内置对多种编程语言的支持,包括但不限于 C/C、Python、JavaScript、TypeScript、Java 和 Go 等。VSCode 主要用于编…

【C语言进阶】动态内存与柔性数组:C语言开发者必须知道的陷阱与技巧

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言动态内存管理 🌹🌹期待您的关注 🌹🌹 ❀C语言动态内存管理 &…

数据结构-链式二叉树-四种遍历

博客主页:【夜泉_ly】 本文专栏:【数据结构】 欢迎点赞👍收藏⭐关注❤️ 数据结构-链式二叉树-四种遍历 1.前言2.前、中、后序遍历2.1前序遍历2.1中、后序遍历 3.层序遍历3.1递归实现3.2队列实现关于在Pop之后为什么还能用tmp访问节点&#x…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络,使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址,其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…

第二期: 第二节 , 裸机编程 , gpio

1 首先就是 看原理图: 这里有两个 LED 核心板的原理图。 可以看到 是这个脚。 2 然后就是 查看数据手册。 从 数据手册可以看出 ,一共有这么多的 gpio 组, 但是这些 组 是有复用的&#xf…

非常实用的桌面日历 你桌面上的备忘录和提醒工具

在快节奏的现代生活中,时间管理成为了每个人不可或缺的技能。随着数字化时代的到来,我们虽然拥有了智能手机、平板电脑以及各类时间管理应用,但那份传统而温馨的桌面日历,却依然以其独特的魅力,在无数人的工作台上占据…

油耳拿什么清理比较好?好用的无线可视挖耳勺推荐

油耳的朋友通常都是用棉签来掏耳。这种方式是很不安全的。因为使用棉签戳破耳道和棉絮掉落在耳道中而引起感染的新闻不在少数。在使用过程中更加建议大家可视挖耳勺来清理会更好。不仅清晰度得干净而且安全会更高。但最近这几年我发现可视挖耳勺市面上不合格产品很多&#xff0…

澳元/美元价格:进一步上涨看向美联储

澳元/美元在0.6700关口附近波动不定。美元因美国经济数据强劲而重新获得上行动力。接下来,澳大利亚将公布西太平洋领先指数。 美元的再度走强使风险敏感资产承压,澳元/美元周二维持在0.6700关口上方的小幅区间内。尽管美元反弹,澳元仍成功维…

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是:答案一定不能在问题的后面,要自己想、自己背;回答都是最精简、最精简、最精简,可能就几个字,你要自己自信的展开。 面试官01:什么是模数转换/ADC?说说模数转换的流程? …

STM32F407 - 01

嵌入式概述 什么是嵌入式?嵌入式是以应用为中心,以计算机技术为基础 硬件可裁剪 适用于对体积 可靠性 功耗 性能等方面有着严格的专用计算机系统 简单来说 除了处理桌面PC和服务器之外所有的控制类设备都是嵌入式. 通用计算机和专用计算机的区别 两者的区别在于技术的发展和…

Python编码系列—Python组合模式:构建灵活的对象组合

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

质量与数量的博弈!大模型数据建设

质量与数量的博弈!大模型数据建设 前言大模型数据建设 前言 大数据和人工智能(DataAI)技术正以惊人的速度改变着我们的生活和工作方式。大模型数据建设作为人工智能领域的核心组成部分,其重要性日益凸显。 大模型数据建设涉及到海…

硬件工程师笔试面试——电机

目录 18、电机 18.1 基础 电机原理图 电机实物图 18.1.1 概念 18.1.2 电机的一些基本分类和特点 18.2 相关问题 18.2.1 不同类型的电机在实际应用中有哪些具体的优势和劣势 18.2.2 在设计一个电机系统时,我应该如何考虑电机的选型和配置? 18.2.3 对于需要频繁启停的…

【C++篇】C++类与对象深度解析(三):类的默认成员函数详解

文章目录 【C篇】C类与对象深度解析(三)前言4. 运算符重载基本概念4.1 运算符重载的基本概念4.2 重载运算符的规则4.3 成员函数重载运算符4.4 运算符重载的优先级与结合性4.5 运算符重载中的限制与特殊情况4.5.1 不能创建新的操作符4.5.2 无法重载的运算…

TypeScript入门 (一)数据类型与运算符

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。希望通过我的知识点总结,能够帮助你更好地学习TypeScript。💕💕&#x…

【漏洞复现】科荣AIO UtilServlet 代码执行漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

学习实践: Procdump获取本地远控信息

看到一篇文章是通过Procdump获取ToDesk远控信息的,于是实操了一下;顺便也测试了一下向日葵远控,发现都是适用的。该方法对于肉鸡提权有一定价值。 1、获取ToDesk远控信息 测试版本:ToDesk v4.7.4.3 测试工具:procdump、…

【Java EE】文件IO

Author:MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 目录 一、文件是什么? 二、针对文件系统操作的API 1.文件路径,文件名,文件是否存在 2. 创建文件 3.删除文件&#…