matplotlib seaborn 数据可视化(3)——2维数据立体直方图(伪等高图)

利用numpy.histogram2d分箱,之后使用ax,bar3d输出3d条形图。

from matplotlib.image import NonUniformImage
import matplotlib.pyplot as plt
import numpy as np
%matplotlib
mu = np.array([-1,1])
cov = np.array([[1, 0.9],[0.9, 1]])
step=0.1
x = np.arange(mu[0]-3*cov[0,0],mu[0]+3*cov[0,0],step)
y = np.arange(mu[1]-3*cov[1,1],mu[1]+3*cov[1,1],step)
points = 20000
data = np.random.multivariate_normal(mu,cov,points)
hist, x, y = np.histogram2d(data[:,0], data[:,1], bins=(x, y))

fig = plt.figure(figsize=(16,8))
ax = fig.add_subplot(121,title='histogram2d',aspect='equal')
plt.imshow(hist, interpolation='hermite', origin='lower',cmap='jet',extent=[x[0], x[-1], y[0], y[-1]])
ax.set_xlabel('X')
ax.set_ylabel('Y')

#准备3d直方图
ax = fig.add_subplot(122,projection='3d',title='histogram3d')
#合成绘图面
XX, YY = np.meshgrid(x[1:], y[1:])
#建立索引
X = XX.ravel()
Y = YY.ravel()
Z = hist.ravel()/hist.max()
#创建底面作为“数据” Z
bottom = np.zeros_like(hist.ravel())
#指定绘图粒度
dx = dy = step
#3d立方体各面颜色,底面“white”,其余“salmon”
COLOR = ["white", "salmon", "salmon", "salmon", "salmon", "salmon"]
#扩充颜色对应到每个立方体
COLORS = np.tile(COLOR,len(Z))
#坐标面扩展系数
speard = 1/3
#双侧坐标面投影透明度,建议不大于0.5
alpha_1 = 0.25
#双侧坐标面投影线条宽度,建议不大于0.1
width = 0.05
#底坐标面等高图透明度,建议不小于0.5
alpha_2= 0.75
#底坐标面等高图层数,建议区间 [50,100]
zlevel = int(len(x)/(2*step)) 
#利用3d条形图方式绘图
#原本应为 ax.bar3d(X, Y, Z, dx, dy, dz, ...)
#令原 “Z” 为全0的 bottom,“dz” 为数据 Z
ax.bar3d(X, Y, bottom, dx, dy, Z, shade=False, color=COLORS,edgecolor='black')
#在xoz坐标面堆叠条形图
ax.bar(X, Z, zs=(1+speard)*y.max(), width=width, zdir='y', fill=False, edgecolor='blue', alpha=alpha_1)
#在yoz坐标面堆叠条形图
ax.bar(Y, Z, zs=(1+speard)*x.min(), width=width, zdir='x', fill=False, edgecolor='red', alpha=alpha_1)
#在xoy面绘制等高图
ax.contourf(XX, YY, hist, zdir='z', offset=-(1+speard)*Z.max(), cmap='jet', alpha=alpha_2, levels=zlevel)
#限制坐标轴范围
ax.set_xlim((1+speard)*x.min(),(1+speard)*x.max())
ax.set_ylim((1+speard)*y.min(),(1+speard)*y.max())
ax.set_zlim((1+speard)*-Z.max(),(1+speard)*Z.max())
#显示坐标轴标识
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

运行结果:
在这里插入图片描述
来自matplotlib官方文档“Create 3D histogram of 2D data”

https://matplotlib.org/stable/gallery/mplot3d/hist3d.html?highlight=bar3d

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)


fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x, y = np.random.rand(2, 100) * 4
hist, xedges, yedges = np.histogram2d(x, y, bins=4, range=[[0, 4], [0, 4]])

# Construct arrays for the anchor positions of the 16 bars.
xpos, ypos = np.meshgrid(xedges[:-1] + 0.25, yedges[:-1] + 0.25, indexing="ij")
xpos = xpos.ravel()
ypos = ypos.ravel()
zpos = 0

# Construct arrays with the dimensions for the 16 bars.
dx = dy = 0.5 * np.ones_like(zpos)
dz = hist.ravel()

ax.bar3d(xpos, ypos, zpos, dx, dy, dz, zsort='average')

plt.show()

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fanshaoliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值