Nature 期刊图复现|Python 实现双轴高维直方图与重叠分布图

论文地址:

https://www.nature.com/articles/s41586-023-06391-z

论文题目:

Tropical forests are approaching critical temperature thresholds

复现图片:

图 1 气候变暖温度频数重叠直方图:该图展示了极端气候变暖前后温度分布的频数变化特征。横坐标为观测温度(Temp),左侧蓝色纵坐标对应常温对照组(ambient)的频数计数,右侧橙色纵坐标对应增温处理组(warmed)的频数计数。通过双坐标轴与半透明条形图的重叠对比,可以清晰直观地观察到增温后整体温度分布的右移趋势。此外,图表右上角嵌套了两个极端高温区间的嵌入子图(Insets),分别用于精准放大展示常温组在 42.8°C及增温组在 50.9°C附近的极端高温频数细节。图注(Caption)图 1 变暖背景下温度频数分布特征及极端高温区间嵌套图。

配色方案:

python 复制代码
COLOR_SCHEMES = {
    1:  ['#5B9BD5', '#ED7D31'],  # 经典蓝橙 (原图复现)
    2:  ['#3B528B', '#5DC870'],  # Viridis 科技绿调
    3:  ['#00A087', '#3C5488'],  # Lancet 风格 (青绿与深蓝)
    4:  ['#4DBBD5', '#E64B35'],  # Nature 风格 (明朗红蓝)
    5:  ['#00468B', '#ED0000'],  # Science 风格 (高对比深蓝红)
    6:  ['#1A365D', '#D69E2E'],  # 经典商务蓝金
    7:  ['#008080', '#FF6347'],  # 现代青色与番茄红
    8:  ['#4A5568', '#CBD5E0'],  # 工业高级黑灰阶
    9:  ['#704214', '#F5F5DC'],  # 地球大地色系
    10: ['#2C3E50', '#E74C3C'],  # Flat UI 优雅深灰红
    11: ['#3F51B5', '#FF4081'],  # Material Design 靛蓝粉红
    12: ['#1ABC9C', '#2ECC71'],  # 薄荷绿与翡翠绿 (清新风格)
    13: ['#673AB7', '#FF9800'],  # 神秘深紫与生动橙
    14: ['#34495E', '#BDC3C7'],  # 银灰与深海蓝 (冷调学术)
    15: ['#8E44AD', '#3498DB'],  # 罗兰紫与天空蓝
    16: ['#27AE60', '#F1C40F'],  # 邮政绿与向日葵黄
    17: ['#D35400', '#2980B9'],  # 南瓜橙与冷艳蓝 (高反差)
    18: ['#16A085', '#E67E22'],  # 青松绿与落叶橙
    19: ['#7F8C8D', '#95A5A6'],  # 双重中性灰阶
    20: ['#000080', '#800000']   # 传统海军蓝与深红
}

完整代码:

python 复制代码
import os
import pandas as pd
import matplotlib.pyplot as plt

SELECTED_SCHEME = 4

COLOR_SCHEMES = {
    1:  ['#5B9BD5', '#ED7D31'],  # 经典蓝橙 (原图复现)
    2:  ['#3B528B', '#5DC870'],  # Viridis 科技绿调
    3:  ['#00A087', '#3C5488'],  # Lancet 风格 (青绿与深蓝)
    4:  ['#4DBBD5', '#E64B35'],  # Nature 风格 (明朗红蓝)
    5:  ['#00468B', '#ED0000'],  # Science 风格 (高对比深蓝红)
    6:  ['#1A365D', '#D69E2E'],  # 经典商务蓝金
    7:  ['#008080', '#FF6347'],  # 现代青色与番茄红
    8:  ['#4A5568', '#CBD5E0'],  # 工业高级黑灰阶
    9:  ['#704214', '#F5F5DC'],  # 地球大地色系
    10: ['#2C3E50', '#E74C3C'],  # Flat UI 优雅深灰红
    11: ['#3F51B5', '#FF4081'],  # Material Design 靛蓝粉红
    12: ['#1ABC9C', '#2ECC71'],  # 薄荷绿与翡翠绿 (清新风格)
    13: ['#673AB7', '#FF9800'],  # 神秘深紫与生动橙
    14: ['#34495E', '#BDC3C7'],  # 银灰与深海蓝 (冷调学术)
    15: ['#8E44AD', '#3498DB'],  # 罗兰紫与天空蓝
    16: ['#27AE60', '#F1C40F'],  # 邮政绿与向日葵黄
    17: ['#D35400', '#2980B9'],  # 南瓜橙与冷艳蓝 (高反差)
    18: ['#16A085', '#E67E22'],  # 青松绿与落叶橙
    19: ['#7F8C8D', '#95A5A6'],  # 双重中性灰阶
    20: ['#000080', '#800000']   # 传统海军蓝与深红
}

selected_colors = COLOR_SCHEMES.get(SELECTED_SCHEME, COLOR_SCHEMES[1])
color_amb = selected_colors[0]
color_warm = selected_colors[1]

output_dir = "图表"
os.makedirs(output_dir, exist_ok=True)

excel_file = "data.xlsx"
if not os.path.exists(excel_file):
    raise FileNotFoundError(f"未在当前目录下找到 {excel_file} 文件。")

df_main = pd.read_excel(excel_file, sheet_name="Main Histogram Data")
df_sub = pd.read_excel(excel_file, sheet_name="Subplot Data")

bin_centers = df_main["Bin Center (°C)"].values
amb_counts = df_main["Ambient Count (Left Axis)"].values
warm_counts_scaled = df_main["Warmed Count (Right Axis)"].values
bin_width = 0.5

sub_amb_df = df_sub[["Amb Subplot Bin Center (°C)", "Amb Subplot Count"]].dropna()
sub_heated_df = df_sub[["Heated Subplot Bin Center (°C)", "Heated Subplot Count"]].dropna()

fig, ax1 = plt.subplots(figsize=(10, 4.5), dpi=300)

bars1 = ax1.bar(bin_centers, amb_counts, width=bin_width, color=color_amb,
                edgecolor='black', linewidth=0.4, alpha=0.8, label='ambient')
ax1.set_xlabel('Temp (°C)', fontsize=12)
ax1.set_ylabel('count', color=color_amb, fontsize=12)
ax1.tick_params(axis='y', colors=color_amb)
ax1.spines['left'].set_color(color_amb)
ax1.set_xlim(20, 45)
ax1.set_ylim(0, 2500)

ax2 = ax1.twinx()
bars2 = ax2.bar(bin_centers, warm_counts_scaled, width=bin_width, color=color_warm,
                edgecolor='black', linewidth=0.4, alpha=0.5, label='warmed')
ax2.set_ylabel('count', color=color_warm, fontsize=12)
ax2.tick_params(axis='y', colors=color_warm)
ax2.spines['right'].set_color(color_warm)
ax2.spines['left'].set_color(color_amb)
ax2.set_ylim(0, 10000)

plt.title('Brazil km83 + 2°C warming', fontsize=13, fontweight='bold', pad=10)

lines = [bars1, bars2]
labels = [b.get_label() for b in lines]
ax1.legend(lines, labels, loc='lower right', bbox_to_anchor=(0.9, 0.25),
           frameon=True, facecolor='white', edgecolor='grey')

ax_ins1 = fig.add_axes([0.58, 0.58, 0.12, 0.24])
ax_ins1.bar(sub_amb_df["Amb Subplot Bin Center (°C)"], sub_amb_df["Amb Subplot Count"],
            width=0.5, color=color_amb, edgecolor='black', linewidth=0.4)
ax_ins1.set_title('Amb 42.8°C', fontsize=10, pad=2)
ax_ins1.set_xlabel('Temp (°C)', fontsize=8, labelpad=2)
ax_ins1.set_ylabel('count', fontsize=8, labelpad=2)
ax_ins1.set_xlim(37, 42)
ax_ins1.set_ylim(0, 50)
ax_ins1.tick_params(axis='both', labelsize=8)

ax_ins2 = fig.add_axes([0.76, 0.58, 0.12, 0.24])
ax_ins2.bar(sub_heated_df["Heated Subplot Bin Center (°C)"], sub_heated_df["Heated Subplot Count"],
            width=0.5, color=color_amb, edgecolor='black', linewidth=0.4)
ax_ins2.set_title('Heated 50.9°C', fontsize=10, pad=2)
ax_ins2.set_xlabel('Temp (°C)', fontsize=8, labelpad=2)
ax_ins2.set_ylabel('count', fontsize=8, labelpad=2)
ax_ins2.set_xlim(42, 46)
ax_ins2.set_ylim(0, 200)
ax_ins2.tick_params(axis='both', labelsize=8)

output_image_path = os.path.join(output_dir, "brazil_warming_plot.png")
plt.savefig(output_image_path, bbox_inches='tight')
plt.close()

print(f"Plot successfully saved to: {output_image_path}")

数据获取

评论+私信获取

VX获取:Nature 期刊图复现|Python 实现双轴高维直方图与重叠分布图

相关推荐
青 春 记 忆7 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO37 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO9 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白9 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲10 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)12 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机12 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor69213 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy14 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽14 小时前
真实即粗糙,光滑是伪造
人工智能·python