论文地址:
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}")
数据获取
评论+私信获取