前述学习过程只能怪,已经探究了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直方图的绘制教程,显示了坐标轴刻度标签和名称标签,增加了图名,修改了方块颜色。