当前位置:首页>python>Python绘图第3期——面积图

Python绘图第3期——面积图

  • 2026-09-02 18:54:04
Python绘图第3期——面积图
之前我分享了一个Python的分组柱状图模板:
今天分享一个Python的面积图模板,先看效果:

本文共7个部分(获取方式在 “06 ”部分):

00.数据组织格式

原始数据一共两个工作表。其中“x”工作表存储着16种细胞观测的正常化皮层深度(上图);“y”工作表存储着16种细胞观测的细胞密度(下图)。
注:数据源于阿昆,仅展示前5个字段(数据获取在 “06 ”部分)

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. 数据读取与格式转换

这里直接读取工作空间下的"data.xlsx"文件。
# =======================# 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)}
这里的2.2部分我们将原始数据从“宽数据”转换到了“长数据”。简单理解长数据就是“每个变量单独成列,每个观测独占一行”。
原始数据转换后的长数据长这样:

03. 绘制图形

这里一定要预设图片大小,这样后面我们调整图形细节(如字体大小)才是有意义的。图片尺寸是多少,应取决于你PPT或word中给这张图预留了多大空间。
其他需要注意的地方我在注释中已经写的很清楚,大家细心读注释即可。
# =======================# 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"].values    y = cell_subset["Value"].values    color = 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. 图形导出

这里只需要强调一点:在Python里,先保存图片,再显示图片!
不然你就会得到一张空白画布!
# 5. 保存与显示# 保存图片plt.savefig("面积图_Python.png",   # 可保存为 PNG、PDF、SVG、EPS 等多种格式            dpi=300,              #分辨率            bbox_inches='tight')  # 控制保存时的边界裁剪范围(自动计算并裁剪掉图形周围多余的空白边距,使保存的图片仅包含有效内容区域)# 显示图形plt.show()
运行上面代码,得出下图:

06. 面积图模板获取方式

公众号后台回复关键词 py面积图
即可获取“代码”+“示例数据”+“效果图”
少一个字都不行哦~(直接复制红色关键词,劝你别自己输入)

往期推荐

联系我们

欢迎大家添加微信以及评论交流~
请转发给你周围需要的人~
将本公众号设为星标,第一时间获取后续推文~

#Python#面积图#科研绘图#Python绘图#Python画面积图#科研#研究生#生态学绘图

最新文章

随机文章