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 实现双轴高维直方图与重叠分布图

相关推荐
小熊Coding38 分钟前
从零打造一款回合制 RPG 游戏:基于 Pygame 的《塔影守卫》全解析
python·游戏·计算机专业·pygame·rpg·2d游戏
myenjoy_11 小时前
串口采集与 Modbus RTU——字节流里的时间敏感博弈
网络·python·网络协议·tcp/ip
易舟云财务软件1 小时前
财务 AI Python 实战:从自动化报表到智能风控的应用场景
人工智能·python·自动化
武雄(小星Ai)1 小时前
一个模型干五件事:拆解 NVIDIA Cosmos 3 的物理 AI 全模态架构
人工智能·python·agent
Mr.Daozhi2 小时前
跨境电商选品完整流水线:Google Trends筛词+Meta广告分析,CLI工具设计实战
开发语言·爬虫·python·跨境电商·工具链·选品
装不满的克莱因瓶2 小时前
掌握典型卷积神经网络的搭建
人工智能·python·深度学习·神经网络·机器学习·ai·cnn
海鸥-w2 小时前
用python (fastapi)做项目第一天创建项目结构,数据建表,ORM配置安装,写第一个接口
数据库·python·fastapi