当前位置: 首页 > news >正文

python画图|3D bar进阶探索

前述学习过程只能怪,已经探究了3D直方图的基础教程,详见下述链接:

python画图|3D直方图基础教程-CSDN博客

实际上,基础文章直接进入了堆叠教程,相对来说基础的程度不够,因此有必要再次探索。

【1】官网教程

首先还是来到官网,学习官方的教程:

bar3d(x, y, z, dx, dy, dz) — Matplotlib 3.9.2 documentation

教程非常简洁,我们做一下解读。

【2】代码解读

首先是numpy和matplotlib的引入:

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

然后对图形风格做了指引,暂不作为解读重点:

plt.style.use('_mpl-gallery') #设置画图颜色等风格

然后定义了变量:

# Make data
x = [1, 1, 2, 2] #定义变量
y = [1, 2, 1, 2] #定义变量
z = [0, 0, 0, 0] #定义变量
dx = np.ones_like(x)*0.5 #dx的输出结果都是0.5,和x的维度一致
dy = np.ones_like(x)*0.5 #dy的输出结果都是0.5,和x的维度一致
dz = [2, 3, 1, 4] #dz的结果

这段代码相对简单,需要注意的是:

dx = np.ones_like( )的功能是:输出全是1的数组,数组的维度和like()括号中的数组一致。

dx = np.ones_like(x)输出全是1的数组,数组的维度和x的维度(1X4)一致为测试这个功能,输入以下代码后运行:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算plt.style.use('_mpl-gallery') #设置画图颜色等风格# Make data
x = [1, 1, 2, 2] #定义变量
y = [1, 2, 1, 2] #定义变量
z = [0, 0, 0, 0] #定义变量
dx = np.ones_like(x)*0.5
dy = np.ones_like(x)*0.5
dz = [2, 3, 1, 4]print('np.ones_like(x)=\n',np.ones_like(x))

输出结果为:

np.ones_like(x)=
 [1 1 1 1]

再之后,就定义了要画3D直方图:

# Plot
fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) #定义要画3D图
ax.bar3d(x, y, z, dx, dy, dz) #定义画3D直方图

 其中,ax.bar3d(x, y, z, dx, dy, dz)函数,(x, y, z,)代表了需要绘制的3个坐标,(dx, dy, dz)代表了每个直方图的长度、宽度和高度。

最后设置了坐标轴和进行图形输出:

ax.set(xticklabels=[],yticklabels=[],zticklabels=[])  #设置坐标轴plt.show() #输出图形

输出结果为:

图1

【3】修改代码

【3.1】显示坐标轴刻度

图1虽然画出了3D直方图,但坐标轴没有刻度尺寸。因此尝试修改坐标轴属性代码,使坐标轴显示刻度尺寸。

将ax.set部分拆开,写成下述形式:

ax.set_xticklabels=([])  #设置坐标轴
ax.set_yticklabels=([])
ax.set_zticklabels=([])  #设置坐标轴

此时的输出结果为:

图2

由图2可见,输出结果显示了坐标轴刻度标签。

【3.2】显示坐标轴标签

图2虽然显示了坐标轴刻度尺寸,但没有显示各个轴的名称,因此有必要继续增加代码,显示轴标签:

ax.set_xlabel("x", color="g", fontsize=20) #设置x轴标签
ax.set_ylabel("y", color="g", fontsize=20) #设置y轴标签
ax.set_zlabel("z", color="g", fontsize=20) #设置z轴标签plt.show() #输出图形

此时的输出结果为:

图3

图3显示了坐标轴标签。

【4】改写代码

 前述图形对3D直方图做了一些完善,但实际上可修改的地方还很多。由于明显的修改将会显著区别于官网图形,因此要重新开一个章节。

首先,将最先约束画图风格的代码改为注释:

#plt.style.use('_mpl-gallery') #设置画图颜色等风格

然后,给3dbar设置颜色:

ax.bar3d(x, y, z, dx, dy, dz,color='y',alpha=0.58) #定义画3D直方图

这里的 color='y'表示图形为黄色;alpha=0.58表示不透明度,alpha越大越不透明,1为完全不透明。

再然后把变量做修改,使其尽可能有区别:

x = [1, 1, 2, 2] #定义变量
y = [1, 2, 1, 2] #定义变量
z = [3,5,6,5] #定义变量
dx = np.ones_like(x)*0.5 #dx的输出结果都是0.5,和x的维度一致
dy = np.ones_like(x)*0.5 #dy的输出结果都是0.5,和x的维度一致
dz = [1,2,3,4] #dz的结果

再给图形加一个名称:

ax.set_title('3Dbar')

此时的输出图形为:

图4

由图4可以看到不同的方块似乎起始高度不一样,因此尝试改变试图角度:

图5

此时非常清晰,方块的起始高度是z = [3,5,6,5],然后方块的具体高度是dz = [1,2,3,4] 。

至此的完整代码为:

import matplotlib.pyplot as plt  #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算
from scipy.ndimage import label
from sympy.abc import alpha#plt.style.use('_mpl-gallery') #设置画图颜色等风格# Make data
x = [1, 1, 2, 2] #定义变量
y = [1, 2, 1, 2] #定义变量
z = [3,5,6,5] #定义变量
dx = np.ones_like(x)*0.5 #dx的输出结果都是0.5,和x的维度一致
dy = np.ones_like(x)*0.5 #dy的输出结果都是0.5,和x的维度一致
dz = [1,2,3,4] #dz的结果# Plot
fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) #定义要画3D图
ax.bar3d(x, y, z, dx, dy, dz,color='y',alpha=0.58) #定义画3D直方图#ax.set(xticklabels=[],
#      yticklabels=[],
#      zticklabels=[]
#      )
ax.set_xticklabels=([])  #设置坐标轴
ax.set_yticklabels=([])
ax.set_zticklabels=([])  #设置坐标轴
ax.set_xlabel("x", color="g", fontsize=20) #设置x轴标签
ax.set_ylabel("y", color="g", fontsize=20) #设置y轴标签
ax.set_zlabel("z", color="g", fontsize=20) #设置z轴标签
ax.set_title('3Dbar')
plt.show() #输出图形

【5】总结

学习了3D直方图的绘制教程,显示了坐标轴刻度标签和名称标签,增加了图名,修改了方块颜色。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mozilla/pdf.js view.html加载指定页码
  • 【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍
  • Π-系上的最小 d-系等于 Π-系上的最小集代数
  • git学习报告
  • 成都睿明智科技有限公司电商服务引领品牌跃升
  • [leetcode]64_最小路径和
  • 持续学习与创新能力的双重提升
  • SDKMAN!软件开发工具包管理器
  • 828华为云征文|使用Flexus X实例集成ES搜索引擎
  • 应用层 II(文件传输协议FTP)【★★】
  • 16.3 k8s容器cpu内存告警指标与资源request和limit
  • 江科大51单片机
  • 整合SpringSecurity框架经典报错
  • docker容器安装nginx
  • 【数据可视化】Arcgis api4.x 热力图、时间动态热力图、timeSlider时间滑块控件应用 (超详细、附免费教学数据、收藏!)
  • canvas 绘制双线技巧
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6系统学习----从Apollo Client看解构赋值
  • Golang-长连接-状态推送
  • java正则表式的使用
  • Js基础知识(四) - js运行原理与机制
  • nfs客户端进程变D,延伸linux的lock
  • PAT A1092
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • TypeScript迭代器
  • V4L2视频输入框架概述
  • Vim 折腾记
  • Vue ES6 Jade Scss Webpack Gulp
  • vue-router 实现分析
  • 关于 Cirru Editor 存储格式
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 树莓派 - 使用须知
  • 新手搭建网站的主要流程
  • 积累各种好的链接
  • ​决定德拉瓦州地区版图的关键历史事件
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (纯JS)图片裁剪
  • (二)Linux——Linux常用指令
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十三)Flink SQL
  • (译) 函数式 JS #1:简介
  • (转)可以带来幸福的一本书
  • **python多态
  • .Family_物联网
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET CLR基本术语
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?