当前位置:首页>python>【科研绘图系列】python绘制地图和柱状图(map & bar plot)

【科研绘图系列】python绘制地图和柱状图(map & bar plot)

  • 2026-09-05 03:56:16
【科研绘图系列】python绘制地图和柱状图(map & bar plot)

介绍

这段代码使用Python的Pandas、Numpy、Matplotlib、Geopandas和Seaborn库,对全球OSA(睡眠呼吸暂停综合征)的分布和流行情况进行了可视化分析。代码分为两个主要部分:绘制世界地图展示OSA分布情况,以及绘制柱状图展示不同国家的OSA流行率。

数据读取与准备

代码首先从CSV文件中读取了两组数据:

  1. figure2a.json
    :包含全球OSA分布的地理数据。
  2. figure2b.csv
    :包含不同国家的OSA流行率数据。

绘制世界地图

world_map_plot函数负责绘制世界地图,展示OSA的分布情况:

  • 使用geopandas.read_file读取地理数据文件。
  • 将count列转换为有序分类变量,以便在地图上正确显示。
  • 定义颜色映射(cmap),使用YlGnBu颜色映射,并去除颜色映射的极端值。
  • 使用plt.subplot_mosaic创建一个复杂的布局,包含一个主地图和两个子地图。
  • 在主地图(ax['a1'])上绘制全球OSA分布情况,并添加图例。
  • 在子地图(ax['a2'])上绘制欧洲地区的放大图,并设置坐标轴范围。
  • 隐藏地图的边框和刻度,使地图更加简洁。
  • 添加水平线,表示纬度线。
  • 调整子图的布局,确保图表美观。

绘制柱状图

OSA_prevalence_countries函数负责绘制柱状图,展示不同国家的OSA流行率:

  • 从CSV文件中读取数据,并根据panel列将数据分为两组。
  • 使用seaborn.barplot绘制柱状图,分别表示轻度OSA(mod_OSA)和重度OSA(sev_OSA)的流行率。
  • 设置Y轴标签为空,避免重复。
  • 隐藏图表的边框和底部刻度,使图表更加简洁。
  • 添加网格线,便于阅读。
  • 设置X轴标签位置在顶部,使图表更加清晰。
  • 设置X轴范围,确保图表的可读性。

加载R包

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport geopandas as gpdimport seaborn as snsimport matplotlib as mplplt.style.use('nature.mplstyle')

画图1

defworld_map_plot():    world = gpd.read_file('metadata/figure2a.json')    world['count']= pd.Categorical(world['count'],ordered=True,                   categories=['<100','100-200','200-300','300-500','500-1000','1000-5000','5000+'])    cmap = mpl.cm.YlGnBu(np.linspace(0,1,15))    cmap = mpl.colors.ListedColormap(cmap[2:-2,:-1])    fig, ax = plt.subplot_mosaic([['a1','a1','a1','a1'],['a1','a1','a1','a1'],['a2','a2','a3','a3']],                                  figsize=(6,5))    world.plot(column='count', ax = ax['a1'],            cmap = cmap, legend =True,edgecolor="#737373", linewidth=0.5, missing_kwds={'color':'#d9d9d9'},               legend_kwds={'loc':"lower left"})    world.plot(column='count', ax = ax['a2'],            cmap = cmap, legend =False,edgecolor="#737373", linewidth=0.5, missing_kwds={'color':'#d9d9d9'},               legend_kwds={'loc':"lower left"})    ax['a2'].set_xlim(-15,35)    ax['a2'].set_ylim(35,75)    ax['a2'].spines.right.set_visible(False)    ax['a2'].spines.top.set_visible(False)    ax['a1'].spines.right.set_visible(False)    ax['a1'].spines.top.set_visible(False)    ax['a1'].spines.bottom.set_visible(False)    ax['a1'].spines.left.set_visible(False)    ax['a1'].tick_params(# changes apply to the x-axis        which='both',# both major and minor ticks are affected        bottom=False,# ticks along the bottom edge are off        top=False,# ticks along the top edge are off        left=False,        labelleft=False,        labelbottom=False)    ax['a3'].spines.right.set_visible(False)    ax['a3'].spines.top.set_visible(False)    ax['a3'].spines.bottom.set_visible(False)    ax['a3'].spines.left.set_visible(False)    ax['a3'].tick_params(# changes apply to the x-axis        which='both',# both major and minor ticks are affected        bottom=False,# ticks along the bottom edge are off        top=False,# ticks along the top edge are off        left=False,        labelleft=False,        labelbottom=False)    ax['a1'].axhline(y=0, color='k', alpha=0.1, linestyle='--')    ax['a1'].axhline(y=30, color='k', alpha=0.1, linestyle='--')    ax['a1'].axhline(y=-30, color='k', alpha=0.1, linestyle='--')    plt.subplots_adjust(left =0.05, bottom =0.045, right =0.97, top =0.97, wspace =0, hspace =0)    plt.show()world_map_plot()

画图2

defOSA_prevalence_countries():    dfs = pd.read_csv('metadata/figure2b.csv')    fig, axs= plt.subplots(1,2, figsize=(3.7,2.7))for n,ax inenumerate(axs):        data = dfs.loc[dfs['panel']==n,:]        ax = sns.barplot(x="mod_OSA",y="country", data=data,ax=ax,                    label="Total", color="#829cbc", legend=False)        ax = sns.barplot(x="sev_OSA",y="country", data=data,ax=ax,                    color="#6290c8", legend=False)        pos = ax.get_yticks()        label= ax.get_yticklabels()        ax.set_ylabel(' ')        ax.set_yticks(pos, label)        ax.spines.right.set_visible(False)        ax.spines.bottom.set_visible(False)        ax.tick_params(# changes apply to the x-axis            which='both',# both major and minor ticks are affected            bottom=False,# ticks along the bottom edge are off            top=True,# ticks along the top edge are off            labeltop=True, labelbottom=False,            right=False,            left=True,            labelleft=True)        ax.grid(axis='x', which='major')        ax.set_xlabel('OSA prevalence, %')        ax.xaxis.set_label_position('top')        ax.set_xlim(None, right=0.35)    plt.tight_layout()    plt.show()OSA_prevalence_countries()

总结

这段代码通过Python的Pandas、Numpy、Matplotlib、Geopandas和Seaborn库,对全球OSA的分布和流行情况进行了可视化分析。代码分为两个主要部分:绘制世界地图展示OSA分布情况,以及绘制柱状图展示不同国家的OSA流行率。

  1. 数据读取与准备
    :从CSV文件中读取了全球OSA分布的地理数据和不同国家的OSA流行率数据。
  2. 绘制世界地图
    :使用Geopandas和Matplotlib绘制了世界地图,展示了OSA的分布情况。地图分为一个主地图和两个子地图,分别展示了全球和欧洲地区的OSA分布情况。
  3. 绘制柱状图
    :使用Seaborn绘制了柱状图,展示了不同国家的OSA流行率。图表分为两组,分别表示轻度和重度OSA的流行率。

整体而言,这段代码提供了一个清晰的框架,用于展示全球OSA的分布和流行情况,有助于科学地评估OSA的全球影响。通过隐藏边框、刻度和添加网格线等操作,代码生成的图表简洁、美观且易于理解。

数据下载

通过网盘分享的文件:211.python论文绘图

  • 百度网盘链接:https://pan.baidu.com/s/1HyHLt4TV1RjxH3sFrJOjGw
  • 提取码:psta

最新文章

随机文章