【Matplotlib】三维图及其俯视图+colorbar的位置调整与颜色、刻度细化

前言

图就是门面,高大上的图看着就涨脸

1.调整颜色条位置

在这里插入图片描述

def weightShow(gause_masks,name="visWeight{}.png"):
    plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
    plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置
    fig = plt.figure()
    
    ax = Axes3D(fig)

    w,h = gause_masks[0].shape[0],gause_masks[0].shape[1]
    x = range(w)
    y = range(h)
    # 把x,y数据生成mesh网格状的数据,因为等高线的显示是在网格的基础上添加上高度值
    X, Y = np.meshgrid(y, x)
    for i,gause_mask in enumerate(gause_masks):
        # ax = fig.add_subplot(1,2,i+1, projection='3d')
        Z = gause_mask
        
        ax.plot_surface(X, Y, Z, rstride = 1,   # row 行步长
                    cstride = 1,           # colum 列步长
                    cmap=plt.cm.jet )      # 渐变颜色
        cf = ax.contourf(X, Y, Z, 
                zdir='Z',  # 使用数据方向
                offset=-2, # 填充投影轮廓位置
                cmap=plt.cm.jet)
        ax.set_zlim(-2, 2)
        ax.set_xlabel("x轴")
        ax.set_ylabel("y轴")
        ax.set_zlabel("z轴")
        if i ==1:
            # https://blog.youkuaiyun.com/qq_42471423/article/details/116133697
            # fig.add_axes([left, bottom, width, height])
            cax = fig.add_axes([0.01,0.05,0.03,0.6]) # bar的举行描述(归一化后的尺度
            cb = plt.colorbar(cf,cax=cax)
        plt.savefig(name.format(i))

2.细化颜色、刻度

在这里插入图片描述

def weightShow(gause_masks,name="visWeight{}.png"):
    plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
    plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置
    fig = plt.figure()
    
    ax = Axes3D(fig)

    w,h = gause_masks[0].shape[0],gause_masks[0].shape[1]
    x = range(w)
    y = range(h)
    # 把x,y数据生成mesh网格状的数据,因为等高线的显示是在网格的基础上添加上高度值
    X, Y = np.meshgrid(y, x)
    for i,gause_mask in enumerate(gause_masks):
        # ax = fig.add_subplot(1,2,i+1, projection='3d')
        Z = gause_mask
        
        ax.plot_surface(X, Y, Z, rstride = 1,   # row 行步长
                    cstride = 1,           # colum 列步长
                    cmap=plt.cm.jet )      # 渐变颜色
        levels = np.arange(0,1.05,0.05) # 对颜色进行渐进细致设置
        cf = ax.contourf(X, Y, Z,levels,
                zdir='Z',  # 使用数据方向
                offset=-2, # 填充投影轮廓位置
                cmap=plt.cm.jet)
        ax.set_zlim(-2, 2)
        ax.set_xlabel("x轴")
        ax.set_ylabel("y轴")
        ax.set_zlabel("z轴")
        if i ==1:
            # https://blog.youkuaiyun.com/qq_42471423/article/details/116133697
            # fig.add_axes([left, bottom, width, height])
            cax = fig.add_axes([0.01,0.22,0.03,0.5]) # bar的举行描述(归一化后的尺度
            cb = plt.colorbar(cf,cax=cax)
            #设置颜色条的刻度
            cb.ax.yaxis.set_major_locator(MultipleLocator(0.1))
            # cb.ax.yaxis.set_minor_locator(MultipleLocator(0.02))
        plt.savefig(name.format(i))
为了满足您的需求,我们将使用Python的Matplotlib库绘制三维网线图和表面图,并设置颜色映射为"autumn"。此外,我们还会从二维视角展示该三维图表。下面是完整的代码实现以及解释: ### 完整代码 ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建数据网格 x = np.linspace(-4, 4, 100) y = np.linspace(-2, 6, 100) X, Y = np.meshgrid(x, y) # 计算Z值 Z = 6 * X**2 - Y**2 # 初始化绘图窗口 fig = plt.figure(figsize=(15, 7)) # 绘制三维网线图 ax1 = fig.add_subplot(121, projection='3d') wireline_plot = ax1.plot_wireframe(X, Y, Z, rstride=5, cstride=5) ax1.set_title('Wireframe Plot of Z = 6*x^2 - y^2') ax1.set_xlabel('X axis') ax1.set_ylabel('Y axis') ax1.set_zlabel('Z axis') # 设置色图为autumn的三维表面图 ax2 = fig.add_subplot(122, projection='3d') surface_plot = ax2.plot_surface(X, Y, Z, cmap=plt.cm.autumn, linewidth=0, antialiased=False) fig.colorbar(surface_plot, shrink=0.5, aspect=5) # 添加颜色条 ax2.view_init(elev=90, azim=-90) # 设置俯视角度(即二维视角) # 标题和其他细节 ax2.set_title('Surface Plot with Autumn Colormap (Top View)') ax2.set_xlabel('X axis') ax2.set_ylabel('Y axis') plt.show() ``` ### 解释说明 1. **导入必要的库** - `numpy`: 用于数值运算,创建数组及矩阵。 - `matplotlib.pyplot`: Python最常用的数据可视化库之一,这里主要用于生成静态图片。 - `mpl_toolkits.mplot3d.Axes3D`: 提供三维坐标系的支持功能。 2. **创建数据网格 (`meshgrid`)** - 使用`np.linspace`分别定义$x$轴范围[-4, 4] 和 $y$轴范围 [-2, 6], 分别取100个点作为样本点。 - 利用`np.meshgrid`, 将这两个一维向量转换成两个维度相同的二维矩阵,以便后续计算$z=f(x,y)=6x^{2}-y^{2}$. 3. **计算$Z$ 值**: 直接按照给定公式逐元素地对$X$, $Y$ 进行平方差操作得到对应的$Z$ 数组。 4. **绘制图像** - 先画出第一个子图——*网线图*(左), 显示的是由直线组成的骨架结构。 - 接着再建立第二个子图 —— *带色彩的地图* 的曲面图 (右),设置了色相渐变为“autumn”,并通过调整查看的角度使其呈现出类似于二维的效果(`view_init`). 5. **添加标注其他设定** - 对于每个子图都加上标题、标签; - 后者还额外加入了颜色栏来辅助理解高度变化趋势。 上述脚本运行结果会弹出一个新的窗口显示两张图画并排排列在一起,左边是三维线条框模型而右边则是顶部视图下的彩色区域填充版本。如果您想要保存此图像文件而不是仅仅在屏幕上观看的话,在`plt.show()`之前可以加入一行命令例如:`fig.savefig("output.png")`. ### 示例效果图描述 最终输出将包括两幅图: - 左侧是一个标准的三维网线图,展示了函数$f(x, y)$的空间形态特征。 - 右侧是从上方正交投影下来的三维表面图,采用暖色调的颜色方案渲染整个平面,使得视觉上看起来像是一张二维地图样式的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星空•物语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值