如何用Matplotlib复刻《Nature Physics》风格的log-log出版物增长图?
匹配《Nature Physics》风格的Matplotlib图表调整方案
核心样式调整步骤
刻度与坐标轴设置
- Y轴启用对数刻度并指定范围:执行
plt.yscale('log'),再通过plt.yticks([10**2, 10**3, 10**4, 10**5, 10**6])确保每个10的幂次都显示刻度。 - X轴按十年间隔设置刻度:若年份范围为1900-2020,用
plt.xticks(range(1900, 2021, 10))实现。 - 隐藏顶部和右侧边框:调用
ax.spines[['top', 'right']].set_visible(False)(使用Axes对象更灵活)。
- Y轴启用对数刻度并指定范围:执行
网格与突变线设置
- 添加浅色虚线网格:
ax.grid(True, linestyle='--', alpha=0.3, color='lightgray'),可通过axis='y'参数仅保留Y轴网格线,适配对数刻度读数需求。 - 垂直虚线标记突变点:假设突变年份为1940、1970、2000,循环执行
ax.axvline(x=year, linestyle='--', color='gray', alpha=0.6)。
- 添加浅色虚线网格:
字体与线条样式
- 全局设置衬线字体:
plt.rcParams['font.family'] = 'serif',可指定'Times New Roman'这类期刊常用字体。 - 调整曲线样式:设置线条为平滑实线,宽度适中,示例:
ax.plot(x_data, y_data, linewidth=2, color='#1f77b4')(参考Nature系沉稳色调)。
- 全局设置衬线字体:
面板标签添加
- 在左上角固定位置添加标签:
ax.text(0.02, 0.98, 'Web of Science', transform=ax.transAxes, va='top', fontweight='bold'),利用轴坐标确保位置不随图表缩放偏移。
- 在左上角固定位置添加标签:
完整示例代码片段
import matplotlib.pyplot as plt import numpy as np # 模拟年度论文增长数据 years = np.arange(1900, 2021) papers = 100 * np.exp(0.03*(years-1900)) # 指数增长模拟 # 初始化绘图对象 fig, ax = plt.subplots(figsize=(8, 6)) # 绘制主趋势曲线 ax.plot(years, papers, linewidth=2, color='#1f77b4') # 配置Y轴对数刻度 ax.set_yscale('log') ax.set_ylim(10**2, 10**6) ax.set_yticks([10**2, 10**3, 10**4, 10**5, 10**6]) # 配置X轴十年间隔刻度 ax.set_xticks(range(1900, 2021, 10)) ax.set_xlim(1900, 2020) # 隐藏顶部/右侧坐标轴边框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) # 添加浅色虚线网格 ax.grid(True, linestyle='--', alpha=0.3, color='lightgray', axis='y') # 绘制突变点垂直虚线 mutation_years = [1940, 1970, 2000] for year in mutation_years: ax.axvline(x=year, linestyle='--', color='gray', alpha=0.6) # 添加左上角面板标签 ax.text(0.02, 0.98, 'Web of Science', transform=ax.transAxes, va='top', fontweight='bold', fontfamily='serif') # 优化布局 plt.tight_layout() plt.show()
细节优化提示
- 配色可参考《Nature Physics》官方配色调整线条、网格的颜色值,提升风格匹配度。
- 调整刻度标签字体大小:
plt.rcParams['xtick.labelsize'] = 10、plt.rcParams['ytick.labelsize'] = 10,对齐期刊正文字号。 - 若需要更精细的刻度标签格式,可使用
FuncFormatter自定义对数刻度的显示样式。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

