1. 问题
类似这样的图是怎么绘制的?
2. Python方案
刚好看到了:[Pyplot] 绘制三维散点图使用颜色表示数值大小
这篇文章有现成的画法,摘录过来备用(做了一定的优化)。
import matplotlib.ticker
import matplotlib.pyplot as plt
import random
# 1.0 初始化数据
# f(x,y,z) = v
# 其中x,y,z为随机数,v=x*y*z
x = [random.randint(0,50) for i in range(0,20)]
y = [random.randint(0,50) for i in range(0,20)]
z = [random.randint(0,50) for i in range(0,20)]
v = [(x[i]+y[i])*z[i] for i in range(0,20)]
# 1.1 根据各个点的值(v[]),设置点的颜色值,每个点的颜色使用一个rgb三维的元组表示,例如,若想让点显示为红色,则颜色值为(1.0,0,0)
# 设置各个点的颜色
# 每个点的颜色值按照colormap("seismic",100)进行设计,其中colormap类型为"seismic",共分为100个级别(level)
min_v = min(v)
max_v = max(v)
color = [plt.get_cmap("seismic", 20)(int(float(i-min_v)/(max_v-min_v)*100)) for i in v]
# 2.0 显示三维散点图
# 新建一个figure()
fig = plt.figure()
# 在figure()中增加一个subplot,并且返回axes
ax = fig.add_subplot(111, projection='3d')
ax.view_init(
# elev=30, # 仰角
azim=225 # 方位角
)
# 设置colormap,与上面提到的类似,使用"seismic"类型的colormap,共100个级别
plt.set_cmap(plt.get_cmap("seismic", 20))
# 绘制三维散点,各个点颜色使用color列表中的值,形状为"."
im = ax.scatter(x, y, z,s=200,c=color,marker='.')
# 2.1 增加侧边colorbar
# 设置侧边colorbar,colorbar上显示的值使用lambda方程设置
fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))
# 2.2 增加坐标轴标签
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
# 2.3显示
plt.show()
结果如图所示:
注意:使用的matplotlib包版本为3.5
3. Matlab 方案
% sets=geneParasets();
load paraselect-cold2;
% mea = mea * 100000000;
base = -5:-1;
index = 1;
for i = 1:size(base, 2)
for j = 1:size(base, 2)
for k = 1:size(base, 2)
x = base(i);
y = base(j);
z = base(k);
c = mea(index,1);
% fprintf("%.4f %.4f %.4f=== %.4f \n",x,y,z,c);
scatter3(x, y, z,50,c,'filled');
hold on;
index = index+1;
end
end
end
title('测试');
xlabel('X');ylabel('Y');zlabel('Z');
colormap summer;
colorbar;
%
% function sets = geneParasets()
% sets = [];
% base = [10e-5,10e-4,10e-3,10e-2,10e-1];
% for i = 1:size(base, 2)
% for j = 1:size(base, 2)
% for k = 1:size(base, 2)
% once = [base(i), base(j), base(k)];
% sets = [sets; once];
% end
% end
% end
% end