

本文共7个部分(获取方式在 “06 ”部分):
00.数据组织格式


01. 设置工作环境
# =======================# 1. 工作环境与数据读取# =======================# 1.1 导入必要的库import osimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom matplotlib.ticker import FuncFormatter, MultipleLocator# 1.2 设置工作空间os.chdir("D:\Desktop\Py科研绘图\Python论文插图绘制模板第3期-面积图")
02. 数据读取与格式转换
# =======================# 2. 数据读取与格式转换# =======================# 2.1 分别读取 x(横坐标)和 y(数值)data_x = pd.read_excel("data.xlsx", sheet_name="x")data_y = pd.read_excel("data.xlsx", sheet_name="y")# 2.2 数据整理# 目的:把“宽表”变成“长表”,方便循环绘图cell_data_list = []for col_x, col_y in zip(data_x.columns, data_y.columns):# 只处理列名相同的数据(保证 x 和 y 对应)if col_x == col_y:temp_df = pd.DataFrame({"Depth": data_x[col_x], # 横坐标"Value": data_y[col_y], # 数值"Cell": col_x # 分组标签(图例用)})cell_data_list.append(temp_df)# 2.3 合并cell_data_listz中所有的16组数据cell_data = pd.concat(cell_data_list, ignore_index=True)# 2.4 删除缺失值(避免绘图报错)cell_data = cell_data.dropna(subset=["Depth", "Value"])# 2.5 获取所有类别(16个 cell type)unique_cells = cell_data["Cell"].unique()# 2.6 颜色设置(16条曲线)Area_params = {"colors": ["#a30643", "#c42c4b", "#df5756", "#f47044", "#fa9756","#fdba6b","#fdd985", "#feeea3", "#f9fcb6", "#ecf6aa", "#cdea9d","#aadca3","#7fcba4", "#52acad", "#3389bc", "#4b66ad"]}# 2.7 为每个类别分配颜色cell_color_map = {cell: Area_params["colors"][i]for i, cell in enumerate(unique_cells)}

03. 绘制图形
# =======================# 3. 绘制图形# =======================# 3.1 设置图片大小(宽 × 高)fig, ax = plt.subplots(figsize=(12, 3))# 3.2 绘制面积图# 循环绘制16个细胞for cell in unique_cells:# 从所有数据中,取出“某一个 cell 类型”的数据,并按深度排序cell_subset = cell_data[cell_data["Cell"] == cell].sort_values("Depth")# 指定 “某一个 cell 类型”面积图中的横坐标、纵坐标和颜色x = cell_subset["Depth"].valuesy = cell_subset["Value"].valuescolor = cell_color_map[cell]# fill_between = 面积图函数ax.fill_between(x, y, # 横纵坐标alpha=0.3, # 透明度facecolor=color, # 填充颜色edgecolor=None, # 不设置描边label=cell # 图例名称)# 这里单独绘制面积图的描边ax.plot(x, y,color=color,linewidth=2 # 描边粗细)# 3.3 坐标轴标题ax.set_xlabel("Cortical depth (normalized)", # 横轴标题fontdict={"family": "DejaVu Sans", # 横轴标题字体"size": 12, # 横轴标题字号"style": "italic"}) # 横轴字体风格ax.set_ylabel("Cell density", # 纵轴标题fontdict={"family": "DejaVu Sans", # 纵轴标题字体"size": 12, # 纵轴标题字号"style": "italic"}) # 纵轴标题风格
04. 调整细节
# =======================# 4. 细节调整# =======================# 4.1 设置横纵轴显示范围ax.set_xlim(0, 1.1)ax.set_ylim(0, 1)# 4.2. 刻度字体设置for label in ax.get_xticklabels() + ax.get_yticklabels():label.set_fontproperties(fm.FontProperties(family="DejaVu Sans", size=10, style='italic'))# 4.3 横纵轴标签保留1位小数ax.xaxis.set_major_formatter(FormatStrFormatter('%.1f'))ax.yaxis.set_major_formatter(FormatStrFormatter('%.1f'))# 4.4 控制刻度间距ax.xaxis.set_major_locator(MultipleLocator(0.1))ax.yaxis.set_major_locator(MultipleLocator(0.2))# 4.5 图例(放在画布外)legend = ax.legend(title="Cell type", # 图例标题loc='center left', # 选中“图例框的左中位置”作为锚点bbox_to_anchor=(1.02, 0.5), # 把“图例的左中点”对齐到画布 (1.02, 0.5) 这个位置frameon=False, # 去掉边框ncol=1, # 图例一列prop=fm.FontProperties(family="DejaVu Sans", size=8)#图例中字体及字号)# 4.6 图例标题字体legend.get_title().set_fontproperties(fm.FontProperties(family="DejaVu Sans", size=10))# 4.7 让图例色块不透明(避免 alpha=0.3 的影响)for handle in legend.legend_handles:handle.set_alpha(1.0)# 4.8 去掉上、右边框ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)# 4.9 只保留 y 轴网格ax.yaxis.grid(True, which='major',color='gray', linewidth=0.6, alpha=0.65)ax.xaxis.grid(False)# 让网格线在图形下面ax.set_axisbelow(True)# 4.10 布局调整# 给右侧图例腾空间(否则会被裁掉)plt.subplots_adjust(left=0.12,right=0.68, # 控制图例空间top=0.95,bottom=0.12)
05. 图形导出
# 5. 保存与显示# 保存图片plt.savefig("面积图_Python.png", # 可保存为 PNG、PDF、SVG、EPS 等多种格式dpi=300, #分辨率bbox_inches='tight') # 控制保存时的边界裁剪范围(自动计算并裁剪掉图形周围多余的空白边距,使保存的图片仅包含有效内容区域)# 显示图形plt.show()

06. 面积图模板获取方式
往期推荐




联系我们


