Python如何按条件与样本占比设置多折线图差异化透明度
住宅逐时能耗曲线分温度组透明度调整方案
基础信息
- 数据集结构:Pandas DataFrame格式,每行存储单日24小时逐时能耗值(取值范围0-1),最后一列
Temp_avg为当日户外平均温度 - 原有绘图规则:基于
Temp_avg做coolwarm色阶映射,低温日显示为蓝色、高温日显示为红色,颜色深浅随温度数值线性变化 - 待实现需求:
- 占比较低的温度分组保留原有映射颜色,但设置更低透明度,避免干扰占比更高的核心分组展示,核心分组线条保持完全不透明(
alpha=1) - 透明度逻辑自动化:自动统计高低温组(阈值15℃)样本量,样本量更少的分组自动应用低透明度设置,无需手动指定调整对象
- 占比较低的温度分组保留原有映射颜色,但设置更低透明度,避免干扰占比更高的核心分组展示,核心分组线条保持完全不透明(
原有实现代码与示例
原有代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.colors import Normalize # 生成6行24列的随机示例能耗数据 random_data = np.random.rand(6,24) df = pd.DataFrame(random_data) df.index = ['Day_1', 'Day_2', 'Day_3', 'Day_4', 'Day_5', 'Day_6'] df['Temp_avg'] = [30, 28, 4, 6, 5, 9] print(df) # 生成温度对应的色阶映射 cmapR = cm.get_cmap('coolwarm') norm = Normalize(vmin=df['Temp_avg'].min(), vmax=df['Temp_avg'].max()) colors = [cmapR(norm(v)) for v in df['Temp_avg']] # 绘图 df.iloc[:, 0:24].T.plot(kind='line', color=colors, legend=False) plt.show()
示例DataFrame输出
0 1 2 ... 22 23 Temp_avg Day_1 0.806990 0.406354 0.095396 ... 0.492237 0.205613 30 Day_2 0.437527 0.172589 0.285325 ... 0.781534 0.964967 28 Day_3 0.434903 0.175761 0.386593 ... 0.282011 0.539182 4 Day_4 0.465063 0.223923 0.094135 ... 0.372364 0.608879 6 Day_5 0.993202 0.089822 0.976565 ... 0.515035 0.739329 5 Day_6 0.561553 0.759399 0.500864 ... 0.909193 0.723620 9
原有绘图效果
修改后实现代码
核心逻辑:统计高低温分组样本量,识别少数类分组后,将该组对应颜色的alpha通道值修改为自定义低透明度,多数类保持alpha=1即可。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.colors import Normalize # 生成6行24列的随机示例能耗数据 random_data = np.random.rand(6,24) df = pd.DataFrame(random_data) df.index = ['Day_1', 'Day_2', 'Day_3', 'Day_4', 'Day_5', 'Day_6'] df['Temp_avg'] = [30, 28, 4, 6, 5, 9] # 生成温度对应的色阶映射 cmapR = cm.get_cmap('coolwarm') norm = Normalize(vmin=df['Temp_avg'].min(), vmax=df['Temp_avg'].max()) colors = [cmapR(norm(v)) for v in df['Temp_avg']] # ------------------ 自动调整分组透明度 ------------------ temp_threshold = 15 # 高低温分组阈值,可根据需求修改 minor_alpha = 0.3 # 少数类线条透明度,可根据需求调整(0-1,越小越淡) # 统计两组样本量 high_temp_mask = df['Temp_avg'] > temp_threshold high_temp_count = high_temp_mask.sum() low_temp_count = len(df) - high_temp_count # 逐行调整颜色透明度 adjusted_colors = [] for is_high_temp, rgba in zip(high_temp_mask, colors): r, g, b, _ = rgba # 判断当前行所属组是否为少数类 is_minor = (high_temp_count < low_temp_count and is_high_temp) or \ (low_temp_count < high_temp_count and not is_high_temp) current_alpha = minor_alpha if is_minor else 1 adjusted_colors.append((r, g, b, current_alpha)) # ------------------------------------------------------------- # 传入调整后的颜色列表绘图 df.iloc[:, 0:24].T.plot(kind='line', color=adjusted_colors, legend=False) plt.show()
逻辑说明
- 示例数据中高温日共2天、低温日共4天,高温日为少数类,最终绘图时红色高温线透明度为0.3,蓝色低温线保持完全不透明,不会被少数类线条干扰
- 若后续数据集低温日样本量少于高温日,代码会自动将低温组蓝色线条设为半透明,无需手动修改判断逻辑
- 可通过修改
temp_threshold调整高低温分界值,修改minor_alpha调整少数类线条的透明程度
内容的提问来源于stack exchange,提问作者Lorenzo Siboni
相关产品推荐
相关产品推荐

