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

学习了一段时间的画图,已经掌握了一些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.mzph.cn/web/53055.shtml

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

相关文章

Mina protocol - 体验教程

Mina protocol - 体验教程 一、零知识证明( Zero Knowledge Proof )1、零知识证明(ZKP)的基本流程工作流程: 2、zkApp 的优势:3、zkApp 每个方法的编译过程: 二、搭建第一个zkapp先决条件1、下载或者更新 zkApp CLI​2…

黑神话悟空+云技术,游戏新体验!

近期,一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案,正在改变人们的游戏体验方式,使得高性能游戏可以在更多设备上流畅运行。 那么,黑神话悟空如…

Hazel 2024

不喜欢游戏的人也可以做引擎,比如 cherno 引擎的作用主要是有两点: 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件,称之为资产 assets 不做窗口类的应用栈,可能要花一年才能做一个能实际使用的应用,只需…

VSCode扩展连接虚拟机MySQL数据库

在虚拟机安装MySQL vscode通过ssh远程登录Ubuntu 在vscode终端运行以下命令。 sudo apt-get install mysql-server-5.7 用以下命令确认MySQL是否安装完成。 sudo mysql MySQL安装成功。 在VSCode安装SQL扩展 扩展名:MySQL Shell for VS Code。 安装完成后&am…

JavaScript高级——闭包的作用

1、使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期) 2、让函数外部可以操作(读写)到函数内部的数据(变量/函数) 3、函数执行完后,函数内部声明的局…

使用原生HTML的drag实现元素的拖拽

HTML 拖放(Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能。例如,用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按…

java进销存系统源码:管店云进销存解决方案

在当今数字化转型的大背景下,企业对高效、可靠的进销存管理系统的需求日益增长。Java作为一种广泛使用的编程语言,以其成熟的技术栈和强大的生态系统,成为了开发高性能进销存系统的首选语言之一。本文将介绍一款基于Java进销存系统源码的“管…

c++刷题

17.电话号码的组合 来源于题解思路&#xff1a; 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…

Cartographer源码理解

一、前言 最近一个半月&#xff0c;利用空余时间对Cartographer源码进行了简单的阅读&#xff0c;在这里做了个简单梳理&#xff0c;和大家分享交流。 cartographer源码量其实是有点大的&#xff0c;逐行逐句去解释实在是有心无力了&#xff0c;而且已经有大佬做了类似的事情…

Java笔试面试题AI答之单元测试JUnit(5)

文章目录 25. 简述什么是Junit 忽略测试&#xff08;Ignore Test&#xff09;&#xff1f;一、基本概念二、使用方法三、注意事项四、示例 26. 简述什么是Junit 超时测试&#xff08;Timeout Test&#xff09;&#xff1f;Junit 超时测试的主要特点包括&#xff1a;实现方式&am…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

一些写leetcode的笔记

标准库中的string类没有实现像C#和Java中string类的split函数&#xff0c;所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现&#xff0c;stringstream默认遇到空格、tab、回车换行会停止字节流输出。 #include <sstream> #incl…

部分动态铜皮的孤岛无法删除。报错

(SPMHCI-1): Cannot break shape into fragments. 网上寻找了很多答案&#xff0c;都不太理想&#xff0c;不是我想要的方法。 终于功夫不负有心人&#xff0c;在Cadence官方论坛找到了蛛丝马迹。 Breaking Static shape into fragments - PCB Design - PCB Design & IC …

uniapp 做一个查看图片的组件,图片可缩放移动

因为是手机端&#xff0c;所以需要触摸可移动&#xff0c;双指放大缩小。 首先在components里建个组件 查看图片使用 uni-popup 弹窗 要注意 transform的translate和scale属性在同一标签上不会一起生效 移动就根据触摸效果进行偏移图片 缩放就根据双指距离的变大变小进行缩…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

[网络]http的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …

【C++二叉树】102.二叉树的层序遍历

107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 层序遍历&#xff0c;但是要注意输出的结果是一个二维数组&#xff0c;不是一层一个值一个值的输出&#xff0c;而是要一层一层的输出。可以通过一个循环控制每一层的数据个数&#xff…

PyCharm 安装教程

传送门 PyCharm 是一款由 JetBrains 开发的强大的 Python 集成开发环境&#xff08;IDE&#xff09;。它支持多种功能&#xff0c;包括调试、代码补全、智能代码分析、版本控制集成等&#xff0c;特别适合开发 Python 项目。接下来&#xff0c;我们将详细介绍如何在不同操作系…

【C++高阶】解锁C++的深层魅力——探索特殊类的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 类型转换 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C特殊类 &#x1f4d2;1. 不能被拷贝…