Python | 绘制核密度图

news2024/9/21 21:46:56

写在前面

台风天,适合敲代码。前两天正好看到一个有意思的核密度图,使用的是seaborn绘制的。之前了解过这个包,但是一致没有去绘制相关的图,这次正好去学习一下相关的函数。

绘制结果如下所示:

主要两个有意思的地方

  • 在一张图上同时绘制两次填色图,一个有意思的实现
  • 在核密度填色图的两侧分别绘制数量占比的柱形图

seaborn

seaborn是一个可以方便绘制多种图片的工具包,包括重叠密度(“山脊图”),带注释的热图,也包括本次分享的核密度图等

之前我绘图用的比较多的是第一选择为cartopy+matplotlib,第二次选是basemap+matploylib,第三次选为proplot,一般都是带投影的地图比较多。感觉seaborn可能更适用于不是投影的地图。

其官网也列举了一些示例,方便学习

  • https://seaborn.pydata.org/examples/index.html

安装

安装非常方便,如果你使用的是anaconda的话,支持pip或者conda

  • https://seaborn.pydata.org/installing.html

pip

 pip install seaborn

conda

conda install seaborn

主要学习的例子来自官网:主要用到的两个绘图函数为 sns.kdeplot

  • https://seaborn.pydata.org/examples/layered_bivariate_plot.html

sns.jointplot

  • https://seaborn.pydata.org/examples/joint_kde.html

这里在官网的基础上读取了sst和gpcp月平均资料进行绘制

代码

import numpy as np
import xarray as xr
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from sklearn.preprocessing import MinMaxScaler
from matplotlib.ticker import FormatStrFormatter
from matplotlib.ticker import MaxNLocator

# 读取 NetCDF 文件
pre_path = r'I://precip.mon.mean.nc'
sst_path = r'I://sst.mon.mean_2016-2020.nc'
ds = xr.open_dataset(pre_path).sortby('lat')
da = xr.open_dataset(sst_path).sortby('lat')

# 选择时间和经纬度范围,并进行插值和填充 NaN 值
pre = (ds.sel(time=slice('2016-01-01', '2020-12-01'), lat=slice(-40, 40), 
             lon=slice(100, 180)).precip.interp(lat=np.arange(-40, 40+2.5, 2.5), 
                                                lon=np.arange(100, 120+2.5, 2.5))).interpolate_na(dim='time', method="linear", fill_value="extrapolate")
sst = da.sel(time=slice('2016-01-01', '2020-12-01'), lat=slice(-40, 40), lon=slice(100, 180)).sst.interp(lat=np.arange(-40, 40+2.5, 2.5), 
                                                lon=np.arange(100, 120+2.5, 2.5)).interpolate_na(dim='time', method="linear", fill_value="extrapolate")

# 提取第一个和最后一个时间点的数据
x1 = sst.sel(time=slice( '2016-01-01', '2017-12-01'   )).values.flatten()
y1 = pre.sel(time=slice( '2016-01-01', '2017-12-01'   )).values.flatten()
x2 = sst.sel(time=slice( '2018-01-01', '2019-12-01'   )).values.flatten()
y2 = pre.sel(time=slice( '2018-01-01', '2019-12-01'   )).values.flatten()

plt.rcParams['font.family'] = 'Times New Roman'
# 创建图形和 GridSpec
fig = plt.figure(figsize=(15, 10), dpi=300)


g = sns.jointplot(
    x=x1, y=y1, 
    fill=True, 
    levels=11, 
    kind="kde", 
    cmap="Reds",
    marginal_ticks=True,
    dropna=True,
    joint_kws={'gridsize':100},
    ratio=4, 
    zorder=1
    ,
    # 设置 hist 图参数
)

sns.kdeplot(x=x1, y=y1, 
            # fill=True,
            levels=11,
            cmap="coolwarm", 
             alpha=0.5,
             ax=g.ax_joint)

sns.kdeplot(x=x2, y=y2, 
            fill=True,
            levels=6,
             cmap="Blues", 
             ax=g.ax_joint) # 在主图上叠加第二组数据的 kde

_ = g.ax_marg_x.hist(x1, bins=20, color="#D3EBF0", edgecolor='gray', label='sst',density=True)
_ = g.ax_marg_x.hist(y1, bins=20, color="#EEC5C5", edgecolor='gray', label='pre',density=True)
_ = g.ax_marg_y.hist(x2, bins=20, color="#D3EBF0", orientation="horizontal", edgecolor='gray', label='2018-2019 X',density=True)
_ = g.ax_marg_y.hist(y2, bins=20, color="#EEC5C5", orientation="horizontal", edgecolor='gray', label='2018-2019 Y',density=True)

# 第一个bar图
g.ax_marg_x.tick_params(labelbottom=True)
g.ax_marg_x.tick_params(labelleft=True)
g.ax_marg_x.grid(True, axis='y', ls=':')
g.ax_marg_x.yaxis.set_major_locator(MaxNLocator(4))

# 第2个bar图

g.ax_marg_y.tick_params(labeltop=False)
g.ax_marg_y.tick_params(labelleft=True)
g.ax_marg_y.grid(True, axis='x', ls=':')
g.ax_marg_y.xaxis.set_major_locator(MaxNLocator(4))

# 设置colorbat的位置 | 显示标签的有效数值
axins1 = inset_axes(g.ax_joint, width="15%", height="60%", loc='upper right', bbox_to_anchor=(0.1, 0.5, 0.1, 0.4), bbox_transform=g.ax_joint.transAxes)
axins2 = inset_axes(g.ax_joint, width="15%", height="60%", loc='lower right', bbox_to_anchor=(0.1, 0.1, 0.1, 0.4), bbox_transform=g.ax_joint.transAxes)

cbar1 = plt.colorbar(g.ax_joint.collections[0], cax=axins1, orientation="vertical")
cbar2 = plt.colorbar(g.ax_joint.collections[2], cax=axins2, orientation="vertical")
cbar1.formatter = FormatStrFormatter('%.2f')
cbar2.formatter = FormatStrFormatter('%.2f')
cbar1.update_ticks()
cbar2.update_ticks()

# 设置轴标签
g.set_axis_labels("SST(°C)", "Precip(mm day$^{-1}$)")


# 添加图例
g.ax_marg_x.legend(loc='upper right',frameon=False,bbox_to_anchor=(0.7, 0.9),ncol=2,prop={'size': 'large'},)


plt.show()

数据地址

相关具体的python文件以及代码放到了GitHub网址:

文件名称为:python-核密度图.ipynb

  • https://github.com/Blissful-Jasper/jianpu_record

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维光场分析

一、单色光波长的复振幅表示 实波函数 复波函数 复振幅 由于时间因子相同,可以用复振幅来描述 光强 1.1 球面波的复振幅(单色点光源发出的光波) 等相位面是同心球面,波矢处处与等相位面垂直,即 是 r = 1 处的振幅 发散球面波: 会聚球面波: <

828华为云征文 | 华为云X实例监控与告警管理详解

前言 随着云计算的飞速发展&#xff0c;越来越多的企业将业务部署在云平台上&#xff0c;云服务器实例的管理变得尤为重要。云实例的稳定性、性能及安全性&#xff0c;直接影响着业务的连续性与用户体验。为了确保这些目标的实现&#xff0c;监控与告警是关键手段。本文将详细…

2024华为杯研赛C题原创python代码+结果表(1-2问)|全部可运行|精美可视化

2024华为杯研赛C题原创python代码结果表&#xff08;1-2问&#xff09;&#xff5c;全部可运行&#xff5c;精美可视化 以下均为python代码&#xff0c;推荐用anaconda中的notebook当作编译环境 第一问&#xff1a; import pandas as pd import numpy as np import matplotl…

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

初步认识C++模版

前言 在C语言中&#xff0c;我们知道函数的形参需要指定类型&#xff0c;但是在C中&#xff0c;我们可以模版实现各种类型参数的通用函数。 1. 泛型编程 我们通过函数重载实现多种类型的同一作用的函数。如交换函数&#xff1a; void Swap(int& left, int& right) …

力扣 167.两数之和||—输入为有序数组

文章目录 题目介绍解法 题目介绍 解法 利用相向双指针&#xff0c;初始时l在最用左边&#xff0c;r在最右边 1.numbers[l] numbers[r] < target 则 l 2.numbers[l] numbers[r] < target 则 r 3.numbers[l] numbers[r] target 说明找到了答案 class Solution {publi…

linux 操作系统下dhcrelay命令介绍和案例应用

linux 操作系统下dhcrelay命令介绍和案例应用 dhcrelay是一个用于DHCP&#xff08;动态主机配置协议&#xff09;中继的命令&#xff0c;主要功能是在没有本地DHCP服务器的子网中转发DHCP请求。这使得不同子网的DHCP客户端能够与位于其他子网中的DHCP服务器进行通信。 dhcrela…

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO&#xff08;You Only Look Once&#xff09;算法来检测球员和网球&#xff0c;并利用卷积神经网络&#xff08;CNNs&#xff09;来提取球场的关键点。此实战项目非常适合提升您的机…

面向对象开发流程例题

答案;C 知识点 面向对象分析 认定对象 组织对象 对象间的相互作用 基于对象的操作 面向对象设计 识别类及对象 定义属性 定义服务 识别关系 识别包 面向对象程序设计 程序设计范型 选择一种OOPL 面向对象测试 算法层 类层 模板层 系统层

发布Java项目到Maven中央仓库

1.背景 本教程为2024年9月最新版 我有一个Java项目&#xff0c;想发布到Maven中央仓库&#xff0c;任何人都可以在pom文件中引用我的代码 引用格式如下&#xff08;以rocketmq为例&#xff09;&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId…

鸿蒙开发之ArkUI 界面篇 十七 购物综合案例

layoutWeight:子元素与兄弟元素主轴方向按照权重进行分配,参数是联合类型&#xff0c;数字或者是字符串&#xff0c;在指定的空间占多少份额&#xff0c;数字越大&#xff0c;表示在空间中占用的份额越多&#xff0c;如果父容器的子组件没有别的指定&#xff0c;剩下的空间全部…

LeetCode[中等] 438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 思路&#xff1a;滑动窗口 s包含p的异位词 ——> 则…

如何导入一个Vue并成功运行

注意1&#xff1a;要确保自己已经成功创建了一个Vue项目&#xff0c;创建项目教程在如何创建Vue项目 注意2&#xff1a;以下操作均在VS Code&#xff0c;教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件&#xff0c;然后点击将文件添加到工作区 2. 选择自己的vue项…

Java 每日一刊(第13期):this super static

“优秀的代码不仅仅是给机器看的&#xff0c;更是给人看的。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; this 关键字super 关键字static 关键字 this 关键字 this 关键字是 Java 中最常见的关键字之一&#xf…

数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;这边为大家整理了一套数据中台Axure高保真原型。这套原型致力于为企业提供全方位的数据服务&#xff0c;助力企业实现数据驱动的创新发展。 下载及预览地址&#xff1a;h…

Spring自定义参数解析器

在这篇文章中&#xff0c;我们认识了参数解析器和消息转换器&#xff0c;今天我们来自定义一个参数解析器。 自定义参数解析器 实现HandlerMethodArgumentResolver的类&#xff0c;并注册到Spring容器。 Component&#xff0f;&#xff0f;注册到Spring public class UserAr…

目标拟合椭圆

对于目标区域&#xff0c;the ellipse fit is computing by matching second-order moments.

吉首大学--23级题目讲解

7-1 单链表基本操作 在 C/C 中&#xff0c;.&#xff08;点&#xff09;和 ->&#xff08;箭头&#xff09;运算符用于访问结构体或类的成员&#xff0c;但它们的使用场景不同。 1. . 运算符 . 运算符用于访问结构体或类的成员&#xff0c;通过对象或结构体变量直接访问。…

双虚拟机架构:在Linux上分别部署Nginx/PHP和MariaDB

在第一台虚拟机上安装 Nginx 和 PHP 更新软件包索引: sudo apt update安装 Nginx: sudo apt install nginx -y启动 Nginx 服务: sudo systemctl start nginx安装 PHP 和 Nginx 的 PHP 支持: sudo apt install php-fpm php-common -y配置 Nginx 以使用 PHP: 查看 PHP…

docker搭建个人网盘,支持多种格式,还能画图,一键部署

1&#xff09;效果 2&#xff09;步骤 2.1&#xff09;docker安装 docker脚本 bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrorsmain/DockerInstallation.sh)docker-compose脚本 curl -L "https://github.com/docker/compose/releases/late…