matplotlib绘图,添加colorbar,添加蒙层,自定义分辨率保存图像

本文介绍了一种绘制高分辨率图像的方法,包括设置坐标轴、colorbar及去除白边等技巧,同时展示了如何通过添加蒙层增强图像效果,并提供了详细的误差热力图绘制步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置坐标轴,colorbar和绘图

绘制特定分辨率的图像,并去除坐标系和白边,得到完整纯粹的图片。

fig = plt.figure(figsize=(6,3),dpi=200)#分辨率设置
plt.figure(1)
im = plt.imshow(error_channels[:, :], cmap='jet', vmax=0.06, vmin=0, origin='lower')  # 保存整个图像的误差热力图
plt.xlim(1, 110)
plt.ylim(1, 31)#设置坐标轴范围
plt.xlabel('Epoch')
plt.ylabel('Channels')
#plt.axis('off')#不显示坐标轴
plt.yticks([1,10,20,31])#设置坐标轴刻度
plt.xticks([1,20,40,60,80,100])
plt.colorbar(im,  fraction=0.0135, pad=0.03)#fraction表示设置colorbar的大小,pad表示与图像之间的间隙
#mp.imsave()#按矩阵形式保存图像
plt.axis('off')
fig = plt.gcf()
fig.set_size_inches(13.0/3,13.29/3) #dpi = 300, output = 1300*1329 pixels
plt.gca().xaxis.set_major_locator(plt.NullLocator())#取出白边的操作
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)
plt.margins(0,0)
plt.show()
fig.savefig('picture_path.png', transparent=True, dpi=300, pad_inches = 0)

为图片添加蒙层:


# 为图片设置蒙层的函数
def put_mask(image, mask_color, beta=0.5):
    # 1.读取图片尺寸,确定和图片尺寸大小一致的蒙层
    # 2.将蒙层与图片融合并输出
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # 将RGB图像转化为CV2中的BGR格式
    x, y, c = image.shape
    bbox = [0, 0, y, x]
    # 3.画出mask
    zeros = np.zeros((image.shape), dtype=np.uint8)
    zeros_mask = cv2.rectangle(zeros, (bbox[0], bbox[1]), (bbox[2], bbox[3]),
                               color=mask_color, thickness=-1)  # thickness=-1 表示矩形框内颜色填充
    try:
        # alpha 为第一张图片的透明度
        alpha = 1
        # beta 为第二张图片的透明度
        gamma = 0
        mask_img = cv2.addWeighted(image, alpha, zeros_mask, beta, gamma)
        print(mask_img.shape)
        mask_img = cv2.cvtColor(mask_img, cv2.COLOR_BGR2RGB)
        return mask_img
    except:
        print('异常')
# 绘制带有蒙层的图初始图像和恢复图像
# 410:蓝色[0, 0, 255]
# 480:深天蓝色[0,191,255]
# 520:纯绿色[0, 255, 0]
# 550:鲜绿色[0, 100, 0]
# 620:橙红色[255, 69, 0]
# 689:深红色[255,0,0]
#对应波段的BGR三原色数据(CV2)
color_m = np.array([[255, 0, 0], [255, 191, 0], [0, 255, 0], [47, 255, 173], [0, 69, 255], [0, 0, 255]])
# 绘制各通道的恢复图像
save_channels = [1, 8, 12, 15, 22, 29]
# 绘制原始高光谱图像(添加蒙层)
for i in np.arange(len(save_channels)):
    im1 = hsi_G[:, :, save_channels[i]]
    im1 = (im1 * 255).astype(np.uint8)
    im1 = put_mask(im1, mask_color=(int(color_m[i, 0]), int(color_m[i, 1]), int(color_m[i, 2])), beta=0.3)
    plt.imshow(im1, vmax=255, vmin=0)

    #     plt.colorbar(im, fraction=0.0495, pad=0.03)
    plt.axis('off')
    fig = plt.gcf()
    fig.set_size_inches(13.0 / 3, 13.29 / 3)
    plt.gca().xaxis.set_major_locator(plt.NullLocator())  # 取出白边的操作
    plt.gca().yaxis.set_major_locator(plt.NullLocator())
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)

    fig.savefig(save_picture_path + str(save_channels[i]) + '_hsi_G_m.png', transparent=True, dpi=300, pad_inches=0)
    plt.show()
    plt.clf()
# 绘制重建的高光谱图像(添加蒙层)
for i in np.arange(len(save_channels)):
    im1 = hsi_R[:, :, save_channels[i]]

    im1 = (im1 * 255).astype(np.uint8)
    im1 = put_mask(im1, mask_color=(int(color_m[i, 0]), int(color_m[i, 1]), int(color_m[i, 2])), beta=0.3)
    plt.imshow(im1, vmax=255, vmin=0)

    plt.axis('off')
    fig = plt.gcf()
    fig.set_size_inches(13.0 / 3, 13.29 / 3)  # dpi = 300, output = 700*700 pixels
    plt.gca().xaxis.set_major_locator(plt.NullLocator())  # 取出白边的操作
    plt.gca().yaxis.set_major_locator(plt.NullLocator())
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)

    fig.savefig(save_picture_path + str(save_channels[i]) + '_hsi_R_m.png', transparent=True, dpi=300, pad_inches=0)
    plt.show()
    plt.clf()

绘制误差热力图的方法:


####绘制误差热力图
#平均误差图:
def picture_mean_error(hsi_R,hsi_G):
    error = np.abs(hsi_R - hsi_G)
    error = error / hsi_G
    error = np.mean(error, axis=2)
    return error
#单个通道的误差图
def picture_error(hsi_R,hsi_G):
    error = np.abs(hsi_R - hsi_G)
    error = error / hsi_G
    return error
save_channels = [1, 8, 12, 15, 22, 29]
# 绘制save_channels中指出的误差图
for i in (save_channels):
    im1 = picture_error(hsi_R[:, :, i], hsi_G[:, :, i])
    im = plt.imshow(im1, cmap='jet', vmax=0.1, vmin=0)
    plt.axis('off')
    fig = plt.gcf()
    fig.set_size_inches(13.0 / 3, 13.29 / 3)  # dpi = 300, output = 700*700 pixels
    plt.gca().xaxis.set_major_locator(plt.NullLocator())  # 取出白边的操作
    plt.gca().yaxis.set_major_locator(plt.NullLocator())
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)
    fig.savefig(save_error_picture_path + str(i) + '_error.png', transparent=True, dpi=300, pad_inches=0)
    plt.show()
    plt.clf()
# 绘制所有通道的平均误差图
im2 = picture_mean_error(hsi_R, hsi_G)
im = plt.imshow(im2, cmap='jet', vmax=0.1, vmin=0)
plt.axis('off')
fig = plt.gcf()
fig.set_size_inches(13.0 / 3, 13.29 / 3)  # dpi = 300, output = 700*700 pixels
plt.gca().xaxis.set_major_locator(plt.NullLocator())  # 取出白边的操作
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.margins(0, 0)
fig.savefig(save_error_picture_path + 'error.png', transparent=True, dpi=300, pad_inches=0)

<think>好的,我现在需要帮助用户解决关于使用热力图进行科研绘图的问题,特别是使用Matplotlib和Seaborn在Python中的方法。首先,我得回忆一下自己对这些库的了解,以及用户可能的实际需求。 用户提到的引用内容中,引用[1]提到Matplotlib和Seaborn是两大支柱,Matplotlib灵活而精细,Seaborn则更高级且简洁。引用[2]和[3]则具体提到了热力图的绘制方法,尤其是Seaborn的便捷性。所以,我应该结合这些信息来组织回答。 首先,用户需要的是科研绘图的方法或工具,所以步骤的清晰性很重要。我应该分步骤讲解,从数据准备到绘图再到样式调整,每个步骤给出代码示例,并比较Matplotlib和Seaborn的不同,因为用户可能想知道两者的区别和适用场景。 接下来,我需要考虑科研绘图的特点,比如需要高质量的图像、标注清晰、颜色准确等。因此,在步骤中应该包括如何调整字体大小、添加标题和标签、选择合适的颜色映射(如coolwarm或viridis),以及如何导出高分辨率的图片。 然后,用户可能遇到的问题,比如如何处理缺失值,或者如何自定义颜色条。这时候可能需要提到在数据预处理中的注意事项,以及在绘图函数中的参数设置,比如Seaborn的heatmap函数中的参数annot、fmt、linewidths等。 另外,引用[3]指出Matplotlib的imshow函数需要手动添加colorbar和分隔线,而Seaborn更简单,所以在步骤中应该强调使用Seaborn的便利性,特别是对于科研人员来说,节省时间很重要。 可能还需要提到一些高级技巧,比如聚类热力图,这在科研中常用于显示数据的次结构,这时候可以引入Seaborn的clustermap函数。同时,结合引用[2]提到的Plotly,虽然用户主要问的是Matplotlib和Seaborn,但也可以简要提及其他工具作为扩展。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如美化热力图、处理大数据集、添加统计显著性标记等,这些都是在科研绘图中常见的问题,能够帮助用户深入探索。 需要确保所有的代码示例正确,并且符合用户提到的LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能公式较少,主要关注代码块和说明的正确性。同时,引用标识要正确添加到对应的引用位置,比如在提到Matplotlib和Seaborn时引用[^1],在热力图相关性时引用[^2],在比较两者时引用[^3]。 总结来说,回答的结构应该是步骤式的,先介绍基本绘制方法,再讲进阶优化,然后比较工具差异,最后给出注意事项和相关问题。确保内容详实,代码示例清晰,并且引用正确。</think>### 热力图的科研绘图方法(基于Matplotlib与Seaborn) #### **一、基础绘制步骤** 1. **数据准备** 热力图通常用于展示矩阵型数据的相关性或密度分布。以相关性矩阵为例: ```python import numpy as np import pandas as pd # 生成模拟数据(例如基因表达量或物理参数相关性) data = np.random.rand(10, 10) # 10x10矩阵 df = pd.DataFrame(data, columns=[f'Var_{i}' for i in range(1,11)]) ``` 2. **使用Seaborn快速绘制** Seaborn的`heatmap`函数可一键生成热力图,适合科研场景[^2]: ```python import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) sns.heatmap(df, annot=True, fmt=".2f", cmap='coolwarm', linewidths=0.5) plt.title("基因表达相关性热力图", fontsize=12) plt.xlabel("变量", fontsize=10) plt.ylabel("变量", fontsize=10) plt.savefig('heatmap_seaborn.png', dpi=300, bbox_inches='tight') plt.show() ``` - `annot=True`:显示数值 - `cmap`:颜色映射(推荐`coolwarm`、`viridis`) - `dpi=300`:导出高分辨率图像 3. **Matplotlib进阶控制** 若需精细调整(如自定义色标或添加公式标签),可使用Matplotlib的`imshow`函数[^3]: ```python plt.figure(figsize=(8, 6)) im = plt.imshow(df, cmap='RdYlBu') # 添加色标和公式 cbar = plt.colorbar(im) cbar.set_label('相关系数 $r$', rotation=270, labelpad=15) plt.title("能量分布热力图 ($E = mc^2$)", fontsize=12) # 添加坐标轴标签 plt.xticks(range(10), df.columns, rotation=45) plt.yticks(range(10), df.columns) plt.savefig('heatmap_matplotlib.png', dpi=300) ``` #### **二、科研优化技巧** 1. **样式美化** - 使用`plt.rcParams`全局设置字体和分辨率: ```python plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 解决中文乱码 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示 plt.rcParams['savefig.dpi'] = 300 ``` - 通过`mask`参数隐藏对角线或无效值: ```python mask = np.triu(np.ones_like(df, dtype=bool)) # 仅显示下三角 sns.heatmap(df, mask=mask) ``` 2. **高级功能** - **聚类热力图**(显示数据次结构): ```python sns.clustermap(df, cmap='viridis', standard_scale=1) ``` - **添加统计显著性标记**(如星号`*`): ```python # 假设p_values是显著性矩阵 plt.text(2, 3, '*', ha='center', va='center', color='white') ``` #### **三、工具对比** | 工具 | 优点 | 适用场景 | |-------------|------------------------------------------|---------------------| | **Seaborn** | 代码简洁、自动标注、内置统计功能 | 快速生成标准热力图 | | **Matplotlib** | 像素级控制、支持复杂公式渲染[^3] | 定制化需求或组合图表 | #### **四、注意事项** - **数据归一化**:若数据量纲差异大,需先标准化(如`StandardScaler`) - **颜色选择**:避免红绿色系(色盲友好性差),推荐`viridis`或`plasma` - **导出格式**:优先选择`.svg`或`.pdf`以保留矢量信息 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值