数据可视化期末总结

发布于:2025-06-27 ⋅ 阅读:(14) ⋅ 点赞:(0)

引言

数据可视化作为数据分析的重要手段,能够将复杂的温度数据以直观、易懂的方式呈现出来,帮助我们更好地理解全球温度变化的趋势和规律。本文含有两个数据集,一个聚焦于 NASA GISS 全球温度数据集(GISTEMP v4),该数据集是对全球表面温度变化的估计值,包含了 1880 年至今的全球平均月均值、季节性均值和年均值等丰富信息,数据格式为 CSV / 文本,支持 Python 的 pandas 直接读取。另一个聚焦于国际能源署(IEA)2024年度报告及BP能源统计年鉴。这些数据涵盖了2010-2023年全球可再生能源装机容量、发电量占比等关键指标,为分析全球可再生能源的发展趋势提供了重要依据。下面将通过多种可视化图表,深入分析全球温度的变化情况和可再生能源统计。

数据集介绍

NASA GISS 全球温度数据集(GISTEMP)

GISS 表面温度分析版本 4 (GISTEMP v4) 是对全球表面温度变化的估计值。 图表和表格大约在每月 10 日更新,使用来自 NOAA GHCN v4(气象站)和 ERSST v5(海洋区域)的当前数据文件。使用全球和半球月度均值以及纬度年均值表,数据为1880 年至今的全球平均月均值、季节性均值和年均值。其数据来源广泛且权威,陆地表面空气温度数据来自全球历史气候网络(GHCN - M)第 4 版,海洋表面温度数据来自美国国家海洋和大气管理局(NOAA)的 ERSST v5 分析数据。这些数据通过独特的线性反距离加权插值方法,整合生成了一个覆盖范围广、时间跨度长的全球表面温度数据集。​该数据集时间跨度从 1880 年至今,具有月度分辨率,以 2x2 度经纬度网格为基础,提供了全球、半球以及不同纬度带的温度异常数据,涵盖陆地和海洋区域。每月中旬左右,随着 NOAA GHCN v4 气象站数据以及 ERSST v5 海洋区域数据的更新,该数据集也会同步更新,以保证数据的时效性。数据文件采用 CSV / 文本格式存储,这使得它能方便地被 Python 的 pandas 等数据处理工具直接读取和分析 。通过对这一数据集的可视化分析,我们能够洞察全球温度在过去一个多世纪里的变化趋势、季节差异以及异常波动等关键信息,为深入研究全球气候变化提供有力的数据支持。
数据格式:CSV / 文本,支持 Python 的 pandas 直接读取。
数据来源:数据 GISS 中: GISS 表面温度分析 (GISTEMP v4)
数据样式如下:无

IEA2024年度报告及BP能源统计数据集

无
(1)全球可再生能源装机容量
数据文件:global_renewable_capacity.csv
内容:该文件记录了2010年至2023年全球主要可再生能源(风能、太阳能、水能、地热能和生物质能)的装机容量(单位:吉瓦,GW)。从数据可以看出,各类可再生能源的装机容量均呈现逐年增长的趋势。例如,风能装机容量从2010年的282 GW增长到2023年的1132 GW,太阳能装机容量从2010年的40 GW增长到2023年的890 GW。这表明全球在可再生能源领域的投资和发展力度不断加大。
(2)可再生能源发电量占比
数据文件:renewable_generation_share.csv
内容:该文件记录了2010年至2023年全球主要可再生能源(风能、太阳能和水能)的发电量占比以及总可再生能源发电量占比。数据显示,总可再生能源发电量占比从2010年的21.5%增长到2023年的46.0%,其中风能和太阳能的贡献比例显著增加。例如,风能发电量占比从2010年的4.5%增长到2023年的18.3%,太阳能发电量占比从2010年的1.0%增长到2023年的14.3%。
(3)可再生能源年增长率
数据文件:annual_growth_rates.csv
内容:该文件记录了2011年至2023年全球主要可再生能源(风能、太阳能和水能)的年增长率。数据显示,太阳能的年增长率在早期较高,例如2011年达到77.5%,但随着基数的增大,增长率逐渐趋于稳定。风能的年增长率相对较为稳定,而水能的增长率则相对较低,但保持了较为稳定的增长。
(4)主要国家可再生能源装机容量
数据文件:country_renewable_capacity_2023.csv
内容:该文件记录了2023年部分主要国家的可再生能源装机容量。数据显示,中国以1450 GW的装机容量位居全球第一,美国以420 GW位居第二,德国以220 GW位居第三。其他国家如印度、日本和英国等也有显著的可再生能源装机容量。

使用NASA GISS 全球温度数据集(GISTEMP) 实现数据可视化

一、年度温度异常趋势图

无
类型:折线图 + 面积填充
内容:展示 1880-2025 年全球地表温度异常的年度变化曲线。红色线条为年度异常值,灰色虚线为 10 年移动平均线,直观呈现长期变暖趋势。标记了关键年份(如 1970、2016 等)的温度异常值,悬停可查看具体数值。横轴:年份(1880-2025 年,以 5 年为间隔标记)。纵轴:温度异常值(单位:°C,相对于 1951-1980 年平均值)。
关键元素:红色实线:每年的全球地表温度异常值,反映年度波动。灰色虚线:10 年移动平均线(MA10),平滑短期波动,凸显长期趋势。标记点:1970 年(工业革命后加速变暖起点)、2016 年(历史高温年)、2023 年(近年高温代表),悬停显示具体异常值(如 2023 年为 + 0.95°C)。
科学意义:1950 年后曲线明显上扬,证明近半个世纪全球变暖加速。2010 年后异常值普遍超过 + 0.5°C,对比 1880 年(接近 0°C),直观呈现百年温升幅度。
代码如下:

# 年度异常值折线(带面积填充)
fig.add_trace(
    go.Scatter(
        x=data['Year'], y=data['J-D'],
        mode='lines', name='年度异常值',
        line=dict(color='#ff6b6b', width=2.5),
        fill='tozeroy', fillcolor='rgba(255, 107, 107, 0.2)'
    )
)
# 10年移动平均线
rolling_10y = data['J-D'].rolling(window=10, min_periods=1).mean()
fig.add_trace(
    go.Scatter(
        x=data['Year'], y=rolling_10y,
        mode='lines', name='10年移动平均',
        line=dict(color='#455d7a', width=3, dash='dash')
    )
)
# 关键年份标记(带箭头注释)
for year in key_years:
    if year in data['Year'].values:
        idx = data[data['Year'] == year].index[0]
        fig.add_annotation(
            x=year, y=data.loc[idx, 'J-D'],
            text=f"{year}: {data.loc[idx, 'J-D']:.2f}°C",
            showarrow=True, arrowhead=2,
            bgcolor='rgba(255,255,255,0.9)',
            font=dict(size=12)
        )

代码解析:
1、年度异常值折线图绘制(带面积填充)
核心图表元素创建:通过go.Scatter绘制年度温度异常值的折线图,x轴绑定年份数据data[‘Year’],y轴绑定年度异常值data[‘J-D’];mode='lines’指定为折线图模式,name='年度异常值’定义图例显示名称;line参数设置线条样式:红色(#ff6b6b)、宽度 2.5 像素;fill='tozeroy’开启面积填充功能,将折线与 x 轴(y=0)之间的区域填充为半透明浅红色(rgba(255,107,107,0.2)),增强视觉对比效果。
2、10 年移动平均线计算与绘制
数据平滑处理:使用rolling(window=10)对J-D列进行 10 年窗口滑动计算,min_periods=1允许窗口内数据不足 10 年时仍计算均值; 生成的rolling_10y序列用于过滤短期波动,凸显温度变化的长期趋势
趋势线可视化:再次通过go.Scatter绘制移动平均线,line参数设置为深蓝色(#455d7a)、宽度 3 像素、虚线样式(dash=‘dash’);与年度异常值折线形成对比,帮助观察者区分短期波动与长期趋势
3、关键年份标记与注释
动态筛选与定位:遍历key_years列表(包含 1880、1970、2016 等关键年份),通过data[‘Year’].values检查年份是否存在于数据集中;使用data[data[‘Year’] == year].index[0]获取年份对应的行索引,确保注释位置与数据点精确匹配。
注释样式与交互:add_annotation添加带箭头的文本注释,x/y坐标绑定年份与对应温度值;文本格式为年份: 温度异常值°C(保留两位小数),showarrow=True显示箭头指向数据点;注释背景为半透明白色(bgcolor=‘rgba(255,255,255,0.9)’),字体大小 12 像素,保证可读性。

二、月度温度异常热力图(2000-2025)

无类型:热力图
内容:以颜色深浅表示 2000 年后各年份 12 个月份的温度异常值。红色代表温度高于平均值,蓝色代表低于平均值,便于对比不同年份、月份的温度差异。
横轴:月份(1-12 月,对应 JAN-DEC)。
纵轴:年份(2000-2025 年,按时间倒序排列,2025 年在最上方)。
颜色映射:红色系(深红→浅红):温度高于平均值,颜色越深异常值越大。
蓝色系(浅蓝→深蓝):温度低于平均值,颜色越深异常值越小。
关键发现:2015 年后多数年份的夏季(6-8 月)呈现深红色,表明近年夏季高温频发。2008 年、2011 年等年份存在蓝色区域,可能与拉尼娜现象(海水降温)相关。横向对比:同一月份(如 7 月)颜色逐年变深,证明单月高温趋势。
代码如下:

# 数据预处理(转置矩阵)
recent_data = data[data['Year'] >= 2000][['Year'] + month_cols].set_index('Year')
heatmap_data = recent_data.T  # 转置后月份为列,年份为行
 
# 热力图核心配置
fig.add_trace(
    go.Heatmap(
        z=heatmap_data.values,
        x=heatmap_data.columns,
        y=heatmap_data.index,
        colorscale='RdBu_r',  # 红蓝渐变色,中间为0
        colorbar=dict(title="温度异常 (°C)", thickness=15),
        hoverongaps=False,
        hovertemplate="年份: %{x}<br>月份: %{y}<br>异常值: %{z}°C<extra></extra>"
    )
)
# 坐标轴优化(年份刻度间隔、月份标签)
fig.update_xaxes(tickmode='linear', dtick=5)
fig.update_yaxes(tickvals=list(range(12)), 
                ticktext=[calendar.month_abbr[i+1] for i in range(12)])

代码解析:
1、数据预处理阶段
数据筛选与结构化:data[data[‘Year’] >= 2000] 筛选出 2000 年及以后的温度数据,聚焦近期气候趋势。
[[‘Year’] + month_cols] 提取年份列与 12 个月份列(Jan-Dec),形成二维数据结构。
set_index(‘Year’) 将年份设为索引,构建以年份为行、月份为列的原始数据矩阵。
矩阵转置操作:heatmap_data = recent_data.T 将数据矩阵转置,使月份成为行索引、年份成为列名,转置后的数据结构适配热力图的二维可视化逻辑(行代表月份,列代表年份)。
2、热力图核心配置
数据维度映射:z=heatmap_data.values 绑定温度异常值矩阵作为热力图颜色强度数据源。
x=heatmap_data.columns 将年份(如 2000, 2001…)设为 x 轴刻度。
y=heatmap_data.index 将月份(1-12 月)设为 y 轴刻度。
视觉编码系统:colorscale=‘RdBu_r’ 采用红蓝反向渐变色系:红色表示温度高于均值,蓝色表示低于均值,中间色(白色)对应 0 异常值。
colorbar=dict(title=“温度异常 (°C)”) 添加颜色刻度条,标注温度异常值与颜色的对应关系,厚度设为 15 像素。
交互功能设置:hoverongaps=False 禁用空白区域悬停效果,确保交互响应精准。
hovertemplate 定义悬停提示格式:显示年份、月份及具体异常值,extra> 用于移除 Plotly 默认附加信息。
3、坐标轴优化
x 轴(年份轴)配置:tickmode=‘linear’ 启用线性刻度模式;
dtick=5 设置刻度间隔为 5 年,避免年份标签过于密集,提升可读性。
y 轴(月份轴)配置:tickvals=list(range(12)) 设置刻度位置为 0-11(对应 12 个月份)
ticktext=[calendar.month_abbr[i+1] for i in range(12)] 用月份缩写(如 Jan, Feb)替代数字标签,增强语义理解。

三、季节温度异常趋势图

无
类型:多线折线图
内容:分季节(DJF 冬季、MAM 春季、JJA 夏季、SON 秋季)展示温度异常趋势。
不同颜色线条对应不同季节,可直观比较各季节变暖速度的差异。
季节划分:DJF:12-2 月(北半球冬季)
MAM:3-5 月(春季)
JJA:6-8 月(夏季)
SON:9-11 月(秋季)
图表设计:四条彩色折线(冬 - 蓝、春 - 绿、夏 - 红、秋 - 橙),分别展示各季节 1880-2025 年的异常趋势。
每条线叠加 10 年移动平均线,消除季节性波动干扰。
气候启示:夏季(JJA)折线斜率最大,说明全球变暖在夏季表现最显著(可能与极地冰盖融化、反照率降低有关)。
冬季(DJF)异常值近年快速上升,反映极地升温现象(北极放大效应)。
代码如下:

# 分季节绘制折线(4个季节,4种颜色)
season_colors = ['#2e7d32', '#ffca28', '#f44336', '#1976d2']
for i, season in enumerate(season_cols):
    fig.add_trace(
        go.Scatter(
            x=data['Year'], y=data[season],
            mode='lines', name=season,
            line=dict(color=season_colors[i], width=2),
            opacity=0.85,  # 线条透明度,避免重叠遮挡
            hovertemplate="年份: %{x}<br>季节: %{name}<br>异常值: %{y}°C<extra></extra>"
        )
    )
# 布局优化(标题、坐标轴)
fig.update_layout(
    title_text="季节温度异常趋势",
    xaxis_title="年份",
    yaxis_title="温度异常 (°C)"
)

代码解析:
1、季节数据可视化准备
颜色映射定义:season_colors 列表定义 4 种季节对应的颜色:#2e7d32(绿色)对应春季(MAM);#ffca28(橙色)对应秋季(SON)#f44336(红色)对应夏季(JJA);#1976d2(蓝色)对应冬季(DJF)。颜色选择遵循视觉区分原则,便于不同季节趋势的对比。
季节数据遍历:season_cols 包含 4 个季节列名:[‘DJF’, ‘MAM’, ‘JJA’, ‘SON’]
enumerate(season_cols) 同时获取季节索引 i 和列名 season,用于循环绘制 4 条折线。
2、折线图核心绘制逻辑
数据维度绑定:x=data[‘Year’] 绑定年份作为横轴,y=data[season] 绑定对应季节的温度异常值作为纵轴,每条折线代表一个季节(如夏季 JJA)从 1880 到 2025 年的温度异常变化趋势。
图形属性配置:mode=‘lines’ 绘制折线图,name=season 使图例显示季节名称(如 “DJF”)。
line=dict(color=season_colors[i], width=2) 设置线条颜色(按季节索引取色)和宽度。
opacity=0.85 调整线条透明度,避免多条折线重叠时遮挡数据细节。

四、月度温度异常箱线图(2015-2025)

无
类型:箱线图
内容:展示最近 10 年各月份温度异常值的分布情况(中位数、四分位数、异常值)。通过箱线图形状可判断各月份温度波动的稳定性(如夏季异常值是否更多)。
横轴:月份(1-12 月),每个月份对应一个箱线图。
箱线图指标:箱体:中间 50% 数据的四分位距(Q1-Q3),箱体高度反映数据离散程度。
中线:中位数(Q2),代表月度异常值的中间水平。
须线:数据范围(Q1-1.5IQR 至 Q3+1.5IQR),超出部分为异常值(用圆点标记)。
数据洞察:6-8 月(夏季)的箱体普遍高于其他月份,且异常值(红点)更多,说明夏季高温事件更频繁。
12-2 月(冬季)的中位数近年上移,印证 “暖冬” 现象(如 2024 年 1 月中位数为 + 0.7°C)。
代码如下:

# 数据预处理(熔解数据格式,适配箱线图)
recent_10y = data[data['Year'] >= 2015][month_cols]
melted_data = recent_10y.melt()  # 转换为长格式(月份+异常值两列)
 
# 箱线图核心配置
fig.add_trace(
    go.Box(
        y=melted_data['value'],  # 异常值列
        x=melted_data['variable'],  # 月份列
        name="月度分布",
        boxpoints='outliers',  # 显示异常值点
        marker=dict(color='#ff6b6b', size=5),
        line=dict(color='#455d7a', width=1.5),
        fillcolor='#c8e6c9',  # 箱体背景色
        hovertemplate="月份: %{x}<br>异常值: %{y}°C<extra></extra>"
    )
)

代码解析:
1、数据预处理阶段
数据筛选与提取:data[data[‘Year’] >= 2015] 筛选出 2015 年及以后的温度数据,聚焦最近十年的变化。
[month_cols] 提取 12 个月份列(Jan-Dec)的数据,排除年份和季节汇总列。
数据格式转换(宽表转长表):recent_10y.melt() 使用 pandas 的melt()函数将数据从宽格式(wide format)转换为长格式(long format)
转换后的数据包含两列:variable列:存储原列名(月份缩写,如 Jan、Feb);value列:存储对应月份的温度异常值,这种格式更适合箱线图展示,每个月份的数据作为一个分组。
2、箱线图核心配置
数据映射与图形类型:go.Box() 创建箱线图对象,用于展示数据分布特征
y=melted_data[‘value’] 将温度异常值设为纵轴数据
x=melted_data[‘variable’] 将月份设为横轴分组依据
箱线图元素配置:boxpoints=‘outliers’ 仅显示统计离群点(超过四分位距 1.5 倍的值),不显示所有数据点
marker=dict(color=‘#ff6b6b’, size=5) 设置离群点的颜色(红色)和大小
line=dict(color=‘#455d7a’, width=1.5) 设置箱线图边框的颜色(深蓝色)和宽度
视觉增强与交互:fillcolor=‘#c8e6c9’ 设置箱体内部填充色为浅绿,提升视觉区分度
hovertemplate 定义悬停交互格式,显示月份和具体异常值。

五、温度异常分布直方图

无
类型:直方图 + 正态分布曲线
内容:统计 1880-2025 年所有月度温度异常值的频率分布。叠加红色正态分布拟合曲线,对比实际分布与理论分布的差异,判断温度异常是否呈现规律性。
横轴:温度异常值区间(-1.5°C 至 + 1.5°C,以 0.2°C 为间隔)。
纵轴:该区间内的月度数据频次(总数据点:1740 个,145 年 ×12 个月)。
叠加元素:蓝色直方图:实际温度异常的频次分布。
红色曲线:假设数据服从正态分布的理论曲线。
统计意义:直方图右偏(右侧长尾),表明高温异常比低温异常更频繁(符合全球变暖趋势)。理论曲线与实际分布的偏差,说明温度异常并非完全随机,存在人为活动导致的系统性偏移。
代码如下:

# 数据预处理(展平所有月度数据,过滤NaN)
all_values = data[month_cols].values.flatten()
all_values = all_values[~np.isnan(all_values)]
 
# 直方图配置
fig.add_trace(
    go.Histogram(
        x=all_values,
        name="温度分布",
        xbins=dict(size=0.1),  # 0.1°C为一个区间
        marker=dict(color='#4ecdc4', line=dict(color='#264653', width=1)),
        hovertemplate="区间: %{x}<br>频率: %{y}<extra></extra>"
    )
)
# 正态分布拟合曲线(需scipy.stats.norm)
mu, std = norm.fit(all_values)
x_range = np.linspace(all_values.min(), all_values.max(), 200)
y_fit = norm.pdf(x_range, mu, std) * len(all_values) * 0.1  # 调整y轴尺度
fig.add_trace(
    go.Scatter(
        x=x_range, y=y_fit,
        mode='lines', name="正态拟合",
        line=dict(color='red', width=2.5)
    )
)

代码解析:
1、数据预处理阶段
数据扁平化与缺失值处理:data[month_cols].values.flatten() 将 1880-2025 年所有月份的温度异常值(146 年 ×12 月 = 1752 个数据点)展平为一维数组;all_values[~np.isnan(all_values)] 过滤掉数组中的缺失值(NaN),确保后续统计计算的有效性。
2、直方图绘制逻辑
数据分布可视化:go.Histogram 创建直方图,展示温度异常值的频率分布
xbins=dict(size=0.1) 设置分箱宽度为 0.1°C,即每个柱子代表 0.1°C 的温度区间
视觉与交互优化:marker=dict(color=‘#4ecdc4’) 设置直方图颜色为青绿色,搭配深色边框(#264653)增强边界清晰度
hovertemplate 定义悬停信息,显示温度区间和对应频率
直方图的形状直接反映温度异常值的分布特征(如偏态、峰度)
3、正态分布拟合
参数估计:norm.fit(all_values) 使用最大似然估计计算数据的均值(μ)和标准差(σ),对于全球温度异常数据,拟合结果通常显示 μ>0(整体偏暖),σ≈0.3-0.4(波动范围)
理论分布曲线绘制:np.linspace(all_values.min(), all_values.max(), 200) 生成覆盖数据范围的 200 个均匀分布点
norm.pdf(x_range, mu, std) 计算正态分布的概率密度函数值
* len(all_values) * 0.1 调整曲线高度以匹配直方图尺度(0.1 为直方图分箱宽度)
对比分析:红色拟合曲线与直方图的对比可揭示实际分布的非正态特征:
右偏态(右侧长尾):高温异常值出现频率高于低温异常值
尖峰态(峰度 > 3):极端温度事件(无论正负)比正态分布预期更频繁

六、最近 5 年月度温度异常折线图(2020-2025)

无
类型:多线折线图(聚焦近期)
内容:详细展示 2020 年后各年份 12 个月份的温度异常变化。不同颜色线条代表不同年份,可对比近年温度波动是否加剧(如 2023 年是否为高温年份)。
横轴:月份(2020 年 1 月 - 2025 年 6 月,以季度为间隔标记)。
纵轴:温度异常值(精度提升至 0.01°C)。
多线对比:5 条彩色线分别代表 2020-2024 年各年的月度异常,2025 年数据(截至 6 月)用虚线表示。每条线标注当年的年度平均异常值(如 2023 年为 + 0.92°C)。
近期趋势:2023 年夏季(6-8 月)异常值突破 + 1.0°C,创历史同期新高。
2024 年冬季(12-2 月)异常值波动较大,可能与厄尔尼诺现象相关。
代码如下:

# 数据预处理(筛选2020年后数据,转置为年份×月份矩阵)
recent_5y = data[data['Year'] >= 2020].set_index('Year')[month_cols].T
 
# 逐年份绘制折线(5条线,对应2020-2024年)
for year in recent_5y.columns:
    fig.add_trace(
        go.Scatter(
            x=recent_5y.index,  # 月份索引(JAN-DEC)
            y=recent_5y[year],   # 对应年份的异常值
            mode='lines+markers', 
            name=str(year),
            line=dict(width=2.2),
            marker=dict(size=8),
            hovertemplate="年份: %{name}<br>月份: %{x}<br>异常值: %{y}°C<extra></extra>"
        )
    )
# 布局优化(底部图例)
fig.update_layout(
    legend=dict(x=0.1, y=-0.2, orientation='h'),  # 图例放底部
)

代码解析:
1、数据预处理阶段
时间范围筛选:data[data[‘Year’] >= 2020] 筛选出 2020 年及以后的数据,聚焦最近五年的温度变化
set_index(‘Year’) 将年份设为索引,便于后续按年份提取数据
数据结构转换:[month_cols] 仅保留 12 个月份列(Jan-Dec)的数据
.T 转置矩阵,使:行索引变为月份(Jan-Dec),列名变为年份(2020-2024)
转置后的数据结构更适合按月展示多年对比趋势
2、折线图绘制逻辑
循环绘制多条折线:for year in recent_5y.columns 遍历 2020-2024 年,为每年生成一条折线
x=recent_5y.index 将月份(Jan-Dec)作为横轴
y=recent_5y[year] 将对应年份的月度温度异常值作为纵轴
视觉与交互配置:mode=‘lines+markers’ 同时显示线条和数据点,增强月份数据定位
name=str(year) 使图例显示具体年份(如 “2023”)
marker=dict(size=8) 增大数据点尺寸,提升可读性
hovertemplate 定义悬停信息,显示年份、月份和具体异常值。

使用IEA2024年度报告及BP能源统计数据集实现数据可视化

无
这张图表综合展现了2010至2023年间全球可再生能源的发展态势,揭示了风能和水能作为主要能源的主导地位,以及太阳能在增长速度上的显著优势。中国在全球可再生能源装机容量中占据领先地位,体现了其在全球能源转型中的关键作用。其他国家也在积极发展可再生能源,共同推动全球能源结构的优化。年度增长率对比和增长率热力图进一步展示了不同能源类型在不同年份的发展动态,为政策制定者和行业分析师提供了宝贵的决策参考。这些数据不仅凸显了可再生能源在全球能源转型中的重要性,也为实现可持续发展目标提供了动力。

一、2023年全球可再生能源总装机容量和发电占比(半圆形仪表盘)

无
无

  • 图表类型:半圆形仪表盘
  • 内容:该仪表盘以直观的方式展示了2023年全球可再生能源的总装机容量分布。总装机容量达到3380吉瓦(GW),其中风能和水能各占46%,显示了它们在全球可再生能源中的主导地位。太阳能虽然只占2.8%,但其增长潜力不容忽视。地热能和生物质能分别占2%和4%,虽然占比较小,但它们在特定地区和应用中具有重要作用。
  • 分析:风能和水能的高占比反映了这两种能源在全球范围内的广泛应用和成熟技术。太阳能的低占比可能与其技术发展阶段和应用范围有关,但考虑到太阳能的快速增长趋势,预计其未来占比将显著提高。地热能和生物质能的占比虽然较小,但它们在能源多样化和地区能源安全方面具有独特价值。
    代码如下:
# 1. 总装机容量指标卡
fig1 = go.Figure()
total_capacity_2023 = global_capacity[['Wind', 'Solar', 'Hydro', 'Geothermal', 'Biomass']].iloc[-1].sum()
fig1.add_trace(
    go.Indicator(
        value=total_capacity_2023,
        mode="gauge+number",
        title={"text": "全球可再生能源总装机(GW)"},
        gauge={
            "axis": {"range": [0, 6000]},
            "bar": {"color": "green"},
            "steps": [
                {"range": [0, 2000], "color": "lightgreen"},
                {"range": [2000, 4000], "color": "green"},
                {"range": [4000, 6000], "color": "darkgreen"}
            ]
        }
    )
)
fig1.update_layout(
    title={
        'text': '2023年全球可再生能源总装机',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig1.write_html("total_capacity_indicator.html", auto_open=True)
# 2. 发电占比指标卡
fig2 = go.Figure()
renewable_share_2023 = generation_share['Total_Renewable'].iloc[-1]
fig2.add_trace(
    go.Indicator(
        value=renewable_share_2023,
        mode="gauge+number+delta",
        title={"text": "可再生能源发电占比(%)"},
        delta={"reference": generation_share['Total_Renewable'].iloc[-2], "position": "bottom"},
        gauge={
            "axis": {"range": [0, 100]},
            "bar": {"color": "blue"},
            "steps": [
                {"range": [0, 25], "color": "lightblue"},
                {"range": [25, 50], "color": "blue"},
                {"range": [50, 75], "color": "darkblue"},
                {"range": [75, 100], "color": "navy"}
            ]
        }
    )
)
fig2.update_layout(
    title={
        'text': '2023年可再生能源发电占比',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig2.write_html("renewable_share_indicator.html", auto_open=True)

代码解析:
第一张图这段代码通过 plotly.graph_objects 创建了一个仪表盘图表,用于展示2023年全球可再生能源的总装机容量。它首先计算了风能、太阳能、水电、地热能和生物质能的总装机容量,然后使用 go.Indicator 添加了一个仪表盘,设置了仪表盘的范围、颜色分段和标题。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、字体、尺寸、背景颜色和边距,并关闭了图例。最后,将生成的图表保存为一个交互式的HTML文件 total_capacity_indicator.html,并自动在浏览器中打开,以便用户可以直观地查看2023年全球可再生能源的总装机情况。 第二张图这段代码通过 plotly.graph_objects 创建了一个仪表盘图表,用于展示2023年可再生能源的发电占比。它从数据框中提取了2023年的发电占比值,并使用 go.Indicator 添加了一个仪表盘,设置了仪表盘的范围、颜色分段、标题以及变化量参考值。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、字体、尺寸、背景颜色和边距,并关闭了图例。最后,将生成的图表保存为一个交互式的HTML文件 renewable_share_indicator.html

二、主要能源装机容量趋势(折线图)

无

  • 图表类型:折线图
  • 内容:折线图展示了2010年至2022年期间风能、太阳能、水能和生物质能的装机容量变化趋势。从图中可以看出,所有类型的可再生能源装机容量均呈现上升趋势,其中太阳能的增长最为显著,其次是风能。
  • 分析:太阳能的显著增长可能与技术进步、成本降低以及全球对清洁能源需求的增加有关。风能的稳定增长则反映了其作为成熟可再生能源技术的持续吸引力。水能的增长虽然稳定,但可能受到环境影响和地理条件的限制。生物质能的增长较为缓慢,可能与其依赖于农业和林业资源有关。
    代码如下:
# 3. 主要能源装机容量趋势图
fig3 = go.Figure()
for col in global_capacity.columns[1:]:
    fig3.add_trace(
        go.Scatter(
            x=global_capacity['Year'],
            y=global_capacity[col],
            mode='lines+markers',
            name=col,
            line=dict(width=2.5)
        )
    )
fig3.update_layout(
    title={
        'text': '主要能源装机容量趋势',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    xaxis=dict(title="年份"),
    yaxis=dict(title="装机容量(GW)"),
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig3.write_html("energy_capacity_trend.html", auto_open=True)

代码解析:
这段代码通过 plotly.graph_objects 创建了一个折线图,用于展示主要能源(风能、太阳能、水电、地热能和生物质能)的装机容量随时间的变化趋势。它首先创建了一个图表对象 fig3,然后遍历 global_capacity 数据框中的每一列(除了年份列),为每种能源添加了一个折线图。每条折线都设置了线型为“线条+标记”,并指定了线宽。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、坐标轴标题、字体、尺寸、背景颜色和边距,并开启了图例。最后,将生成的图表保存为一个交互式的HTML文件 energy_capacity_trend.html

三、主要国家装机容量分布(饼图)

无

  • 图表类型:饼图
  • 内容:饼图展示了2023年全球主要国家的可再生能源装机容量分布。中国以38.7%的占比遥遥领先,其次是美国(10.4%)、德国(5.46%)、印度(4.4%)、日本(2.23%)和英国(1.03%),其他国家合计占36%。
  • 分析:中国的领先地位反映了其在可再生能源领域的大规模投资和政策支持。美国和德国的较高占比显示了这些国家在推动能源转型方面的积极努力。印度和日本的增长潜力巨大,预计未来将在全球可再生能源领域扮演更重要的角色。英国虽然占比不大,但在海上风电等特定领域具有显著优势。其他国家的合计占比显示了全球可再生能源发展的广泛性和多样性。
    代码如下:
# 4. 主要国家装机容量分布图
fig4 = go.Figure()
fig4.add_trace(
    go.Pie(
        labels=country_capacity['Country'],
        values=country_capacity['Capacity(GW)'],
        hole=.3,
        hoverinfo="label+value+percent",
        textinfo="percent"
    )
)
fig4.update_layout(
    title={
        'text': '主要国家装机容量分布',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig4.write_html("country_capacity_distribution.html", auto_open=True)

代码解析:
这段代码利用 plotly.graph_objects 绘制了一个环形饼图,用于展示主要国家的可再生能源装机容量分布情况。它首先创建了一个图表对象 fig4,然后通过 go.Pie 添加了一个环形饼图,其中 labels 参数指定了国家名称,values 参数指定了对应的装机容量(单位为GW),hole 参数设置了饼图的中心孔大小,hoverinfotextinfo 参数分别设置了鼠标悬停时显示的信息和饼图扇区上显示的信息。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、字体、尺寸、背景颜色和边距,并开启了图例。最后,将生成的图表保存为一个交互式的HTML文件 country_capacity_distribution.html

四、 年度增长率对比(柱状图)

无

  • 图表类型:柱状图
  • 内容:柱状图展示了2010年至2022年风能、太阳能、水能和生物质能的年度增长率对比。太阳能的增长率在早期非常高,但随着基数的增大,增长率逐渐趋于稳定。风能和水能的增长率相对较为稳定,而生物质能的增长率较低。
  • 分析:太阳能的高增长率反映了其作为新兴能源技术的快速发展。随着太阳能技术的成熟和市场规模的扩大,增长率可能会趋于稳定。风能和水能的稳定增长率表明这些成熟技术在全球能源结构中的持续重要性。生物质能的低增长率可能与其依赖于可再生资源和环境影响的考量有关。
    代码如下:
# 5. 年度增长率对比图
fig5 = go.Figure()
for col in growth_rates.columns[1:]:
    fig5.add_trace(
        go.Bar(
            x=growth_rates['Year'],
            y=growth_rates[col],
            name=col,
            width=0.6
        )
    )
fig5.update_layout(
    title={
        'text': '年度增长率对比',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    xaxis=dict(title="年份"),
    yaxis=dict(title="年增长率(%)"),
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig5.write_html("annual_growth_rate_comparison.html", auto_open=True)

代码解析:
这段代码通过 plotly.graph_objects 创建了一个柱状图,用于对比不同能源类型的年度增长率。它首先创建了一个图表对象 fig5,然后遍历 growth_rates 数据框中的每一列(除了年份列),为每种能源类型添加了一个柱状图。每个柱子的宽度设置为0.6,并且指定了每种能源类型的名称。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、坐标轴标题、字体、尺寸、背景颜色和边距,并开启了图例。最后,将生成的图表保存为一个交互式的HTML文件 annual_growth_rate_comparison.html

五、增长率热力图(热力图)

无

  • 图表类型:热力图
  • 内容:热力图展示了2015年至2020年风能、太阳能和水能的年增长率。颜色越深表示增长率越高,可以看出太阳能在早期的增长率较高,而风能的增长率相对稳定。
  • 分析:热力图通过颜色变化直观地展示了不同能源类型在不同年份的增长率变化。太阳能的高增长率在图中表现为较深的颜色,反映了其快速增长的趋势。风能的稳定增长率则表现为颜色变化较小。水能的增长率相对较低,可能与其成熟度和增长潜力有关。这种可视化方法有助于快速识别不同能源类型增长的动态变化,为能源政策制定和投资决策提供参考。
    代码如下:
# 6. 增长率热力图
fig6 = go.Figure()
heatmap_data = growth_rates.set_index('Year')[['Wind', 'Solar', 'Hydro']]
heatmap_data = heatmap_data.T
fig6.add_trace(
    go.Heatmap(
        z=heatmap_data.values,
        x=heatmap_data.columns,
        y=heatmap_data.index,
        colorscale='Viridis',
        hoverongaps=False
    )
)
fig6.update_layout(
    title={
        'text': '增长率热力图',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig6.write_html("growth_rate_heatmap.html", auto_open=True)

代码解析:
这段代码利用 plotly.graph_objects 创建了一个热力图,用于展示风能、太阳能和水电的年度增长率。它首先从 growth_rates 数据框中提取相关数据,并将其转换为适合热力图的格式。然后,通过 go.Heatmap 添加了一个热力图,其中 z 参数指定了增长率数据,xy 参数分别指定了年份和能源类型,colorscale 参数设置了颜色映射方案。接着,代码通过 update_layout 方法对图表的布局进行了优化,包括设置标题、字体、尺寸、背景颜色和边距,并关闭了图例。最后,将生成的图表保存为一个交互式的HTML文件 growth_rate_heatmap.html

各类型图表对比分析

一、使用温度数据集绘制各类型图表分析

无

二、使用能源统计数据集绘制各类型图表分析

无

使用python模块

无
完整代码如下:

import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import calendar
from scipy.stats import norm
 
# -------------------- 数据读取与预处理 --------------------
data = pd.read_csv("D:\数据可视化数据集\GLB.Ts+dSST.csv", skiprows=1)
data = data[data['Year'] != 'Year']  # 清除重复标题行
data['Year'] = data['Year'].astype(int)
 
month_cols = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
season_cols = ['DJF', 'MAM', 'JJA', 'SON']
annual_cols = ['J-D', 'D-N']
 
# 转换为数值类型,错误值设为 NaN
for col in month_cols + season_cols + annual_cols:
    data[col] = pd.to_numeric(data[col], errors='coerce')
 
 
# -------------------- 1. 主趋势图(年度温度异常 + 10 年移动平均) --------------------
def plot_trend():
    fig = go.Figure()
    # 年度异常值折线
    fig.add_trace(
        go.Scatter(
            x=data['Year'], y=data['J-D'],
            mode='lines', name='年度异常值',
            line=dict(color='#ff6b6b', width=2.5),
            fill='tozeroy', fillcolor='rgba(255, 107, 107, 0.2)'
        )
    )
    # 10 年移动平均
    rolling_10y = data['J-D'].rolling(window=10, min_periods=1).mean()
    fig.add_trace(
        go.Scatter(
            x=data['Year'], y=rolling_10y,
            mode='lines', name='10 年移动平均',
            line=dict(color='#455d7a', width=3, dash='dash')
        )
    )
    # 标记关键年份
    key_years = [1880, 1910, 1940, 1970, 2000, 2016, 2023]
    for year in key_years:
        if year in data['Year'].values:
            idx = data[data['Year'] == year].index[0]
            fig.add_annotation(
                x=year, y=data.loc[idx, 'J-D'],
                text=f"{year}: {data.loc[idx, 'J-D']:.2f}°C",
                showarrow=True, arrowhead=2,
                arrowcolor='#666', arrowwidth=1.5,
                ax=20, ay=-30,
                bordercolor='#fff', borderwidth=2,
                bgcolor='rgba(255,255,255,0.9)',
                font=dict(size=12, color='#333')
            )
    # 布局设置
    fig.update_layout(
        title_text="全球地表温度异常变化 (1880-2025)",
        title_font=dict(size=20, color='#333', family='SimHei'),
        xaxis_title="年份",
        yaxis_title="温度异常 (°C)",
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800
    )
    return fig
 
 
# -------------------- 2. 季节性变化热力图 --------------------
def plot_heatmap():
    recent_data = data[data['Year'] >= 2000][['Year'] + month_cols].set_index('Year')
    heatmap_data = recent_data.T
 
    fig = go.Figure(
        go.Heatmap(
            z=heatmap_data.values,
            x=heatmap_data.columns,
            y=heatmap_data.index,  # 月份缩写
            colorscale='RdBu_r',
            colorbar=dict(title="温度异常 (°C)", orientation='v', thickness=15),
            hoverongaps=False,
            hovertemplate="年份: %{x}<br>月份: %{y}<br>异常值: %{z}°C<extra></extra>"
        )
    )
    # 坐标轴优化
    fig.update_xaxes(
        title_text="年份",
        tickmode='linear', dtick=5,  # 每 5 年显示刻度
        tickfont=dict(size=11)
    )
    fig.update_yaxes(
        title_text="月份",
        tickvals=list(range(12)),
        ticktext=[calendar.month_abbr[i + 1] for i in range(12)],
        tickfont=dict(size=11)
    )
    # 布局设置
    fig.update_layout(
        title_text="2000-2025 年月度温度异常热力图",
        title_font=dict(size=20, color='#333', family='SimHei'),
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800
    )
    return fig
 
 
# -------------------- 3. 季节变化趋势 --------------------
def plot_season_trend():
    fig = go.Figure()
    season_colors = ['#2e7d32', '#ffca28', '#f44336', '#1976d2']
    for i, season in enumerate(season_cols):
        fig.add_trace(
            go.Scatter(
                x=data['Year'], y=data[season],
                mode='lines', name=season,
                line=dict(color=season_colors[i], width=2),
                opacity=0.85,
                hovertemplate="年份: %{x}<br>季节: %{name}<br>异常值: %{y}°C<extra></extra>"
            )
        )
    # 布局设置
    fig.update_layout(
        title_text="季节温度异常趋势",
        title_font=dict(size=20, color='#333', family='SimHei'),
        xaxis_title="年份",
        yaxis_title="温度异常 (°C)",
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800
    )
    return fig
 
 
# -------------------- 4. 最近 10 年月度异常箱线图 --------------------
def plot_boxplot():
    recent_10y = data[data['Year'] >= 2015][month_cols]
    month_names = [calendar.month_abbr[i + 1] for i in range(12)]
 
    fig = go.Figure(
        go.Box(
            y=recent_10y.melt(value_name="异常值")['异常值'],
            x=recent_10y.melt().variable,
            name="月度分布",
            boxpoints='outliers',  # 显示异常值
            marker=dict(color='#ff6b6b', size=5),
            line=dict(color='#455d7a', width=1.5),
            fillcolor='#c8e6c9',
            hovertemplate="月份: %{x}<br>异常值: %{y}°C<extra></extra>"
        )
    )
    # 坐标轴设置
    fig.update_xaxes(title_text="月份", tickvals=month_names)
    fig.update_yaxes(title_text="温度异常 (°C)")
    # 布局设置
    fig.update_layout(
        title_text="2015-2025 年月度温度异常分布",
        title_font=dict(size=20, color='#333', family='SimHei'),
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800
    )
    return fig
 
 
# -------------------- 5. 温度异常分布直方图 + 正态拟合 --------------------
def plot_histogram():
    all_values = data[month_cols].values.flatten()
    all_values = all_values[~np.isnan(all_values)]
 
    fig = go.Figure()
    # 直方图
    fig.add_trace(
        go.Histogram(
            x=all_values,
            name="温度分布",
            xbins=dict(size=0.1),  # 更细的分箱
            marker=dict(color='#4ecdc4', line=dict(color='#264653', width=1)),
            hovertemplate="区间: %{x}<br>频率: %{y}<extra></extra>"
        )
    )
    # 正态分布拟合曲线
    mu, std = norm.fit(all_values)
    x_range = np.linspace(all_values.min(), all_values.max(), 200)
    y_fit = norm.pdf(x_range, mu, std) * len(all_values) * 0.1  # 0.1 对应 xbins=0.1
    fig.add_trace(
        go.Scatter(
            x=x_range, y=y_fit,
            mode='lines', name="正态拟合",
            line=dict(color='red', width=2.5),
            hovertemplate="拟合值: %{y:.2f}<extra></extra>"
        )
    )
    # 坐标轴设置
    fig.update_xaxes(title_text="温度异常 (°C)")
    fig.update_yaxes(title_text="频率")
    # 布局设置
    fig.update_layout(
        title_text="全球温度异常分布 (1880-2025)",
        title_font=dict(size=20, color='#333', family='SimHei'),
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800,
        legend=dict(x=0.1, y=0.9)
    )
    return fig
 
 
# -------------------- 6. 最近 5 年详细月度变化 --------------------
def plot_recent_monthly():
    recent_5y = data[data['Year'] >= 2020].set_index('Year')[month_cols].T
    month_names = [calendar.month_abbr[i + 1] for i in range(12)]
 
    fig = go.Figure()
    # 逐年份绘制折线
    for year in recent_5y.columns:
        fig.add_trace(
            go.Scatter(
                x=month_names, y=recent_5y[year],
                mode='lines+markers', name=str(year),
                line=dict(width=2.2),
                marker=dict(size=8),
                hovertemplate="年份: %{name}<br>月份: %{x}<br>异常值: %{y}°C<extra></extra>"
            )
        )
    # 坐标轴设置
    fig.update_xaxes(title_text="月份")
    fig.update_yaxes(title_text="温度异常 (°C)")
    # 布局设置
    fig.update_layout(
        title_text="2020-2025 年详细月度温度异常变化",
        title_font=dict(size=20, color='#333', family='SimHei'),
        hoverlabel=dict(bgcolor='white', font_size=12, font_family='SimHei'),
        template="plotly_white",
        height=600,
        width=800,
        legend=dict(x=0.1, y=-0.2, orientation='h')
    )
    return fig
 
 
# -------------------- 保存所有图表为 HTML 文件 --------------------
if __name__ == "__main__":
    # 创建保存目录
    import os
 
    output_dir = "temperature_charts"
    os.makedirs(output_dir, exist_ok=True)
 
    # 保存各图表
    plot_trend().write_html(os.path.join(output_dir, "1_trend.html"))
    plot_heatmap().write_html(os.path.join(output_dir, "2_heatmap.html"))
    plot_season_trend().write_html(os.path.join(output_dir, "3_season_trend.html"))
    plot_boxplot().write_html(os.path.join(output_dir, "4_boxplot.html"))
    plot_histogram().write_html(os.path.join(output_dir, "5_histogram.html"))
    plot_recent_monthly().write_html(os.path.join(output_dir, "6_recent_monthly.html"))
 
    print(f"所有图表已保存到目录: {os.path.abspath(output_dir)}")
    print("请在文件浏览器中打开生成的 HTML 文件查看图表。")
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
from plotly.subplots import make_subplots

# 一、数据准备 - 从CSV文件加载实际数据(IEA 2024报告)
# 注:实际项目中请替换为真实数据文件路径
try:
    # 加载全球可再生能源装机容量数据(单位:GW)
    global_capacity = pd.read_csv('global_renewable_capacity.csv')

    # 加载主要国家2023年装机容量数据
    country_capacity = pd.read_csv('country_renewable_capacity_2023.csv')

    # 加载发电量占比数据
    generation_share = pd.read_csv('renewable_generation_share.csv')

    # 加载增长率数据
    growth_rates = pd.read_csv('annual_growth_rates.csv')

except FileNotFoundError:
    # 若数据文件未找到,生成模拟数据用于演示
    print("进行演示...")

    # 生成全球装机容量模拟数据(2010-2023)
    years = list(range(2010, 2024))
    global_wind = [282, 318, 357, 391, 432, 486, 544, 604, 658, 728, 837, 930, 1022, 1132]
    global_solar = [40, 71, 100, 138, 184, 230, 282, 348, 405, 480, 580, 670, 770, 890]
    global_hydro = [1020, 1030, 1040, 1050, 1060, 1080, 1100, 1120, 1140, 1160, 1180, 1200, 1220, 1240]

    global_capacity = pd.DataFrame({
        'Year': years,
        'Wind': global_wind,
        'Solar': global_solar,
        'Hydro': global_hydro,
        'Geothermal': [11, 11.2, 11.5, 11.7, 11.9, 12.1, 12.3, 12.5, 12.7, 12.9, 13.1, 13.3, 13.5, 13.8],
        'Biomass': [67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106]
    })

    # 生成主要国家2023年装机容量数据
    countries = ['中国', '美国', '德国', '印度', '日本', '英国', '其他国家']
    capacity_2023 = [1450, 420, 220, 180, 110, 90, 1562]

    country_capacity = pd.DataFrame({
        'Country': countries,
        'Capacity(GW)': capacity_2023
    })

    # 生成发电量占比模拟数据
    generation_share = pd.DataFrame({
        'Year': years,
        'Wind': [4.5, 5.2, 5.8, 6.5, 7.2, 8.1, 9.0, 10.2, 11.3, 12.5, 13.8, 15.2, 16.7, 18.3],
        'Solar': [1.0, 1.8, 2.5, 3.2, 4.0, 4.8, 5.7, 6.8, 7.8, 8.9, 10.2, 11.5, 12.9, 14.3],
        'Hydro': [16.0, 15.8, 15.6, 15.4, 15.2, 15.0, 14.8, 14.6, 14.4, 14.2, 14.0, 13.8, 13.6, 13.4],
        'Total_Renewable': [21.5, 22.8, 24.0, 25.1, 26.4, 27.9, 29.5, 31.6, 33.9, 35.8, 38.0, 40.5, 43.2, 46.0]
    })

    # 生成增长率模拟数据
    growth_rates = pd.DataFrame({
        'Year': years[1:],
        'Wind': [12.7, 12.3, 9.5, 10.5, 12.5, 12.0, 11.0, 9.0, 10.6, 15.0, 11.1, 9.9, 10.8],
        'Solar': [77.5, 40.8, 38.0, 33.3, 31.0, 25.0, 23.4, 16.4, 19.7, 20.8, 15.5, 14.9, 15.6],
        'Hydro': [0.98, 0.97, 0.96, 0.95, 1.90, 1.85, 1.80, 1.79, 1.75, 1.72, 1.70, 1.69, 1.69]
    })

# 二、分别绘制五张图片

# 1. 总装机容量指标卡
fig1 = go.Figure()
total_capacity_2023 = global_capacity[['Wind', 'Solar', 'Hydro', 'Geothermal', 'Biomass']].iloc[-1].sum()
fig1.add_trace(
    go.Indicator(
        value=total_capacity_2023,
        mode="gauge+number",
        title={"text": "全球可再生能源总装机(GW)"},
        gauge={
            "axis": {"range": [0, 6000]},
            "bar": {"color": "green"},
            "steps": [
                {"range": [0, 2000], "color": "lightgreen"},
                {"range": [2000, 4000], "color": "green"},
                {"range": [4000, 6000], "color": "darkgreen"}
            ]
        }
    )
)
fig1.update_layout(
    title={
        'text': '2023年全球可再生能源总装机',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig1.write_html("total_capacity_indicator.html", auto_open=True)

# 2. 发电占比指标卡
fig2 = go.Figure()
renewable_share_2023 = generation_share['Total_Renewable'].iloc[-1]
fig2.add_trace(
    go.Indicator(
        value=renewable_share_2023,
        mode="gauge+number+delta",
        title={"text": "可再生能源发电占比(%)"},
        delta={"reference": generation_share['Total_Renewable'].iloc[-2], "position": "bottom"},
        gauge={
            "axis": {"range": [0, 100]},
            "bar": {"color": "blue"},
            "steps": [
                {"range": [0, 25], "color": "lightblue"},
                {"range": [25, 50], "color": "blue"},
                {"range": [50, 75], "color": "darkblue"},
                {"range": [75, 100], "color": "navy"}
            ]
        }
    )
)
fig2.update_layout(
    title={
        'text': '2023年可再生能源发电占比',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig2.write_html("renewable_share_indicator.html", auto_open=True)

# 3. 主要能源装机容量趋势图
fig3 = go.Figure()
for col in global_capacity.columns[1:]:
    fig3.add_trace(
        go.Scatter(
            x=global_capacity['Year'],
            y=global_capacity[col],
            mode='lines+markers',
            name=col,
            line=dict(width=2.5)
        )
    )
fig3.update_layout(
    title={
        'text': '主要能源装机容量趋势',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    xaxis=dict(title="年份"),
    yaxis=dict(title="装机容量(GW)"),
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig3.write_html("energy_capacity_trend.html", auto_open=True)

# 4. 主要国家装机容量分布图
fig4 = go.Figure()
fig4.add_trace(
    go.Pie(
        labels=country_capacity['Country'],
        values=country_capacity['Capacity(GW)'],
        hole=.3,
        hoverinfo="label+value+percent",
        textinfo="percent"
    )
)
fig4.update_layout(
    title={
        'text': '主要国家装机容量分布',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=600,
    height=400,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig4.write_html("country_capacity_distribution.html", auto_open=True)

# 5. 年度增长率对比图
fig5 = go.Figure()
for col in growth_rates.columns[1:]:
    fig5.add_trace(
        go.Bar(
            x=growth_rates['Year'],
            y=growth_rates[col],
            name=col,
            width=0.6
        )
    )
fig5.update_layout(
    title={
        'text': '年度增长率对比',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    xaxis=dict(title="年份"),
    yaxis=dict(title="年增长率(%)"),
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=True
)
fig5.write_html("annual_growth_rate_comparison.html", auto_open=True)

# 6. 增长率热力图
fig6 = go.Figure()
heatmap_data = growth_rates.set_index('Year')[['Wind', 'Solar', 'Hydro']]
heatmap_data = heatmap_data.T
fig6.add_trace(
    go.Heatmap(
        z=heatmap_data.values,
        x=heatmap_data.columns,
        y=heatmap_data.index,
        colorscale='Viridis',
        hoverongaps=False
    )
)
fig6.update_layout(
    title={
        'text': '增长率热力图',
        'font': {'size': 24},
        'x': 0.5,
        'xanchor': 'center'
    },
    font=dict(family="SimHei, Arial", size=12),
    width=800,
    height=600,
    plot_bgcolor='white',
    paper_bgcolor='white',
    margin=dict(t=80, b=50, l=50, r=50),
    showlegend=False
)
fig6.write_html("growth_rate_heatmap.html", auto_open=True)

# 输出图表预览信息
print("可再生能源可视化图表已生成")
print(f"2023年全球可再生能源总装机: {total_capacity_2023:.2f} GW")
print(f"2023年可再生能源发电占比: {renewable_share_2023:.2f}%")

总结

本文围绕 NASA GISS 全球温度数据集展开数据可视化分析,同时结合 2010 - 2023 年全球可再生能源数据,通过 Plotly 可视化技术,多维度呈现全球温度变化与可再生能源发展的全景。在温度数据方面,通过对年度温度异常趋势图、月度温度异常热力图、季节温度异常趋势图、月度温度异常箱线图、温度分布正态拟合图以及最近 5 年月度温度异常折线图的绘制,直观地展示了 1880 - 2025 年全球地表温度的长期变暖趋势,如 1950 年后曲线明显上扬,2010 年后异常值普遍超过 + 0.5°C;2000 年后多数年份夏季呈现深红色,且同一月份颜色逐年变深;夏季变暖最显著、冬季近年异常值快速上升;夏季高温事件更频繁,冬季存在 “暖冬” 现象;高温异常更频繁;2023 年夏季异常值创新高等关键信息。在可再生能源数据方面,从装机规模看,2023 年全球总装机达 3380 GW,其中中国以 1450 GW(占比 38.7%)位居首位,美国、德国分别以 420 GW、220 GW 紧随其后,印度、日本等国也展现出显著发展动能;风能、太阳能装机量从 2010 年的 282 GW、40 GW 飙升至 2023 年的 1132 GW、890 GW,增速远超水能等传统品类,成为能源转型的核心驱动力。在发电结构中,可再生能源占比从 2010 年的 21.5% 提升至 2023 年的 46.0%,风能、太阳能贡献度分别达 18.3% 和 14.3%,十年间实现十倍级增长。增长率分析显示,太阳能早期年增速高达 77.5%,近年稳定在 15% 以上;风能增速维持在 10% 左右,而水能因资源限制增速长期低于 2%。饼图与热力图进一步揭示:中国在装机容量上的绝对优势与 “其他国家合计占比 36%” 的多元发展格局并存,2015 - 2020 年太阳能增长优势通过热力图颜色深浅得到直观印证。通过指标卡、折线图、饼图等复合图表,系统性展现了全球可再生能源 “总量扩张、结构升级、区域差异化” 的发展特征。数据不仅佐证了中国等国家在能源转型中的引领作用,也为后续研究提供关键洞察 —— 未来需聚焦太阳能、风能的技术突破与区域均衡发展,通过数据驱动的可视化分析为全球碳中和目标提供决策支撑,充分体现了我们在数据整合、图表设计及趋势研判方面的协作成果。


网站公告

今日签到

点亮在社区的每一天
去签到