• matplotlib库学习之绘图透明度设置(精炼准确)


    matplotlib库学习之透明颜色设置

    一、简介

    在数据可视化中,透明度设置可以使图表更具层次感,特别是在多层叠加图表时。matplotlib库提供了多种方法来设置图表各个部分的透明度,包括图形、文本、图例、坐标轴等部分。

    二、为什么要设置成透明色?

    设置透明色的主要原因包括:

    • 方便插入论文中
    • 增强视觉效果:透明度可以使图形更加柔和,避免颜色过于突兀。
    • 多图叠加:在多个图形叠加时,通过透明度可以更清晰地观察每层图形的重叠部分。
    • 突出重点:通过调整透明度,可以突出显示重点数据,使图表更加直观易懂。

    三、实例

    如果不做特别说明,我们遵循以下原则:

    • 所有出现的【ax】均为坐标轴对象,【figure】为画布对象;ax和figure是成对出现的,调整样式主要是使用【ax】。

      figure, ax = plt.subplots()
      
    • 所有【plt】开始的函数调用都是我们对未保存的绘图对象的图像的样式设置,这种方法不利于在有多个绘图对象时,单独处理其中一个。

    3.1 实例参考模型(不透明)

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    # 创建图形和子图,并设置画布颜色为 #00C9A7
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
    
    ax.plot(x, y)
    ax.set_title("图形透明设置-baseline-无透明参考图")
    ax.legend(['正弦曲线'])
    
    plt.show()
    

    效果:

    3.2 设置【画布】透明

    【3.1】所示的图,青色部分以及被绘图区遮住的区域属于画布区域。

    需要注意的是,下面设置的透明效果由于施加对象是最底层的对象——画布,完全透明后用plt.show(),画布会呈现白色。如果要看到真正的效果,需要将其保存下来【plt.show()】将图片显示后是可以看到保存的按钮。

    3.2.1 直接设置透明(不创建坐标轴)
    plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
    
    • facecolor:该属性用于设置画布背景色,默认为"#FFFFFF"即白色背景。
    3.2.2 创建坐标轴时设置透明
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
    

    该处设置同上,仅设置的时间不同,对绘图效果无影响。

    3.2.3 利用【figure.patch.set_alpha(0)】设置画布透明
    figure.patch.set_alpha(0)
    

    其中fig是plt.figure对象,常常由下面的语句给出:

    figure, ax = plt.subplots()
    
    3.2.4 示意图

    在这里插入图片描述

    3.2.5 整体代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
    plt.plot(x, y, label='正弦曲线')
    plt.title("图形透明设置-baseline-画布透明")
    plt.legend()
    
    # fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
    # ax.plot(x, y)
    # ax.set_title("图形透明设置-baseline-画布透明")
    # ax.legend(['正弦曲线'])
    
    plt.show()
    

    3.3 设置【绘图区背景】透明

    如不特别说明,本节所有【ax】均为一个坐标轴对象

    3.3.1 方法1
    ax.patch.set_alpha(0)
    

    ax.patch.set_facecolor('none')
    

    ax.set_facecolor('none')
    
    3.3.2 方法2
    plt.rcParams['axes.facecolor'] = 'none'
    

    该方法设置的是全局参数,即每个绘图都会绘图区背景透明;除非你单独用方法1、2、3单独设置某个绘图的参数。

    3.3.3 绘图区背景透明示意图

    在这里插入图片描述

    3.3.4 测试代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False 
    # plt.rcParams['axes.facecolor'] = 'none'
    
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    # 创建图形和子图,并设置画布颜色为 #00C9A7
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
    ax.plot(x, y)
    
    # 下面三条为测试效果语句,取消注释即可运行
    # ax.patch.set_alpha(0)
    # ax.set_facecolor('none')
    # ax.patch.set_facecolor('none')
    
    ax.set_title("图形透明设置-绘图区背景透明")
    ax.legend(['正弦曲线'])
    
    plt.show()
    

    3.4 设置【绘制的图像】透明

    3.4.1 方法1
    ax.plot(x, y, alpha=0.1)
    
    • alpha:不透明度的设置,值越大越不透明

    这里不一定是plot可以是散点图,三维图柱状图等等。

    3.4.2 方法2
    plt.legend(['正弦曲线'], framealpha=0)
    
    3.4.3 示意图

    在这里插入图片描述

    3.4.4 测试代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    # 创建图形和子图,并设置画布颜色为 #00C9A7
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
    ax.plot(x, y, alpha=0.1)
    ax.set_title("图形透明设置-绘制的数据图像本身透明")
    ax.legend(['正弦曲线'])
    
    plt.show()
    

    3.5设置【图例】透明

    3.5.1 方法1
    ax.legend(['正弦曲线'], framealpha=0)
    
    • framealpha:用于设置图例区域的不透明度;默认情况下,图例是白框打底的。
    3.5.2 方法2
    plt.legend(['正弦曲线'], framealpha=0)
    
    3.5.2 示意图

    下图左右部分分别为framealpha=1framealpha=0时的效果:
    在这里插入图片描述

    可以看到右边部分透明了,和背景融为一体。

    3.5.3 测试代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False 
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    # 创建图形和子图,并设置画布颜色为 #00C9A7
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
    ax.plot(x, y)
    ax.patch.set_alpha(0)
    
    ax.set_title("图形透明设置-图例透明")
    ax.legend(['正弦曲线'], framealpha=0)
    
    plt.show()
    

    3.6 设置【文本】透明

    3.6.1 标题文本透明
    • 方法1
    ax.set_title(title, alpha=0.5)
    
    • 方法2
    plt.title(title, alpha=0.5)
    
    • 示意图

    在这里插入图片描述

    3.6.2 轴标签文本透明
    • 方法1
    ax.set_xlabel('X Axis Label', alpha=0.5)
    ax.set_ylabel('Y Axis Label', alpha=0.5)
    
    • 方法2
    plt.xlabel("X Axis Label", alpha=0.5)
    plt.ylabel("X Axis Label", alpha=0.5)
    
    • 示意图

    3.6.3 图例文本透明
    legend = ax.legend(['正弦曲线'], framealpha=0)
    for text in legend.get_texts():
        text.set_alpha(0.1)  # 设置图例文本不透明度为 0.1
    
    • 示意图

    3.6.4 刻度标签文本透明
    • 方法1
    for label in ax.get_xticklabels() + ax.get_yticklabels():
        label.set_alpha(0.5)
    
    • 方法2
    plt.setp(ax.get_xticklabels() + ax.get_yticklabels(), alpha=0.5)
    
    • 示意图

    在这里插入图片描述

    3.8 设置【坐标轴脊线】透明

    3.8.1 方法1
    plt.gca().spines['top'].set_alpha(0)
    plt.gca().spines['right'].set_alpha(0)
    plt.gca().spines['left'].set_alpha(0)
    plt.gca().spines['bottom'].set_alpha(0)
    

    或者

    for spine in ['top', 'right', 'left', 'bottom']:
        plt.gca().spines[spine].set_alpha(0)
    
    3.8.2 方法2
    ax.spines['top'].set_alpha(0)
    ax.spines['right'].set_alpha(0)
    ax.spines['left'].set_alpha(0)
    ax.spines['bottom'].set_alpha(0)
    

    或者

    for spine in ax.spines.values():
        spine.set_alpha(0)
    

    或者

    for spine in ['top', 'bottom', 'left', 'right']:
        ax.spines[spine].set_alpha(0)
    
    3.8.3 示意图

    在这里插入图片描述

    3.8.4 部分示例代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 统一设置
    title = '图形透明设置-坐标轴脊线透明'
    
    # 设置中文字体
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    
    # 生成数据
    x = np.linspace(0, 20, 100)
    y = np.sin(x)
    
    # 创建图形和子图,并设置画布颜色为 #00C9A7
    fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
    ax.plot(x, y)
    ax.patch.set_alpha(0)
    
    ax.set_title(title, alpha=1)
    ax.legend(['正弦曲线'], framealpha=0)
    for spine in ax.spines.values():
        spine.set_alpha(0)
    
    # fig.savefig(f'保存的图片\\{title}.png', dpi=300)
    # plt.show()
    

    3.9 设置【刻度线】透明

    3.9.1 方法
    ax.tick_params(left=False, right=False, top=False, bottom=False)
    

    其实这也不算透明了,是直接取消掉了

    3.9.2 示意图

    在这里插入图片描述

    3.10 保存图像为透明

    3.10.1 代码
    plt.savefig("transparent_plot.png", transparent=True)
    
    3.10.2 示意图

    在这里插入图片描述

    四、注意事项

    1. 透明度范围:透明度的取值范围为0到1,其中0表示完全透明,1表示完全不透明。如果参数是表示不透明度,那么和此处效果描述相反。
    2. 保存透明图像:在保存图像时,如果设置了transparent=True,整个图像的背景将是透明的。
    3. 图表叠加:在多图叠加时,合理设置透明度可以使图表更加美观,但要注意透明度过低可能导致图形难以辨识。
    4. 性能影响:过多使用透明效果可能会增加图像渲染的计算量,影响性能。
  • 相关阅读:
    Vue框架--Vue中的数据代理
    信息检索与数据挖掘 | (五)文档评分、词项权重计算及向量空间模型
    Linux防火墙之--SNAT和DNAT
    【iOS】iphone 短信标记未读 bug/ 永远清不干净的红点未读提示 /总结四大解决方案,总有N个适合你
    C语言实现三字棋
    OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换
    springBoot集成websocket实现消息实时推送提醒
    @企业主们看过来,用华为云CDN给你的网页加个速
    WPF Frame content binding page(Using MVVM)
    Linux 中启动 SpringBoot 项目出现 java.lang.OutOfMemoryError Java heap space 错误
  • 原文地址:https://blog.csdn.net/qq_46396470/article/details/140932283