三维散点+颜色标记图

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

在这里插入图片描述

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值