Python: 如何绘制核密度散点图和箱线图?

01 数据样式

这是数据样式:

在这里插入图片描述

要求(我就懒得再复述一遍了,直接贴图):
在这里插入图片描述

在这里插入图片描述

Note:数据中存在无效值NA(包括后续的DEM),需要注意

02 提取DEM

这里我就使用gdal去提取一下DEM列,思路很简单:

首先,提取DEM(GCS_WGS_84)栅格矩阵以及仿射参数,主要是角点经纬度(代码中是左上角经纬度)和经纬度分辨率。接着依据excel中存在的LatLon列在栅格矩阵中对应的行列号,最后通过行列号检索出所有excel行在栅格矩阵中对应的DEM栅格值。

代码如下:

import numpy as np
import pandas as pd
from osgeo import gdal

# 准备
in_path = r'H:\Datasets\Objects\Veg\Plot\cor_by_st.csv'
dem_path = r'H:\Datasets\Objects\Veg\DEM\dem_1km.tif'

# 加载数据
df = pd.read_csv(in_path)
dem = gdal.Open(dem_path)
dem_raster = dem.GetRasterBand(1).ReadAsArray()  # 获取dem栅格矩阵
dem_nodata_value = dem.GetRasterBand(1).GetNoDataValue()  # 获取无效值
lon_ul, lon_res, _, lat_ul, _, lat_res_negative = dem.GetGeoTransform()  # [左上角经度, 经度分辨率, 旋转角度, 左上角纬度, 旋转角度, -纬度分辨率]
lat_res = -lat_res_negative

# 添加DEM列
cols = np.floor((df['Lon'] - lon_ul) / lon_res).astype(int)
rows = np.floor((lat_ul - df['Lat']) / lat_res).astype(int)
df['DEM'] = dem_raster[rows, cols]
df[df['DEM'] == dem_nodata_value] = np.nan

03 绘制核密度散点图

由于matplotlib模块绘制的图需要精调一些参数才会好看,这里直接使用seaborn模块配合matplotlib进行绘制。

由于各个变量都需要与DEM绘制一幅散点核密度图,因此需要循环各个变量。

iter_columns_name = df.columns[4:]
for column_name in iter_columns_name:
	plt.figure(dpi=321)
    cur_ds = df[['DEM', column_name]].dropna(how='any')
    cur_ds['Density'] = gaussian_kde(cur_ds[column_name])(cur_ds[column_name])

    scatter = plt.scatter(x='DEM', y=column_name, c='Density', cmap=cm, linewidth=0, data=cur_ds)
    # scatter = sns.scatterplot(x='DEM', y=column_name, hue='Density', palette='viridis', linewidth=0, data=cur_ds)
    clb = plt.colorbar(scatter)
    clb.ax.set_title('Density', fontsize=8)  # 为色带添加标题
    sns.kdeplot(x='DEM', y=column_name, fill=False, color='gray', data=cur_ds, alpha=0.6)
    title_name = 'Scatter kernel density map of $R^2$ \n between NDVI and {} under DEM'.format(column_name)
    plt.title(title_name, fontsize=16)
    plt.xlabel('DEM', fontsize=14)
    plt.ylabel('$R^2$ between NDVI and {}'.format(column_name), fontsize=14)
    plt.xticks(fontsize=12)
    plt.yticks(fontsize=12)
    plt.show()

绘制的结果如下:

在这里插入图片描述

04 绘制箱线图

箱线图由于变量太多太长了,所以分割成几个子图进行绘制了,如下:

# 绘制箱线图
fig, axs = plt.subplots(4, 1, figsize=(13, 18), dpi=200)
axs = axs.flatten()
fig.suptitle('Box plot of NDVI and correlation coefficients of each variable', fontsize=30, va='top')
for ix, ax in enumerate(axs):
    # ax.figure(figsize=(26, 9), dpi=321)
    df_melt = pd.melt(df, value_vars=iter_columns_name[(ix * 9):((ix + 1) * 9)]).dropna(how='any')
    sns.boxplot(data=df_melt, x='variable', y='value', palette=cm(np.linspace(0, 1, 9)), ax=ax, linewidth=3)
    ax.set_xlabel('', fontsize=25)
    ax.set_ylabel('$R^2$', fontsize=25)
    ax.tick_params(axis='x', labelsize=18)  # x轴标签旋转90度
    ax.tick_params(axis='y', labelsize=18)
    ax.grid(True)
plt.tight_layout(pad=2)
fig.savefig(os.path.join(out_dir, 'Box_R2.png'))
plt.show()

绘制的箱线图如下:

在这里插入图片描述

05 完整代码

# @Author   : ChaoQiezi
# @Time     : 2024/3/11  18:58
# @Email    : chaoqiezi.one@qq.com

"""
This script is used to 是用来绘图滴,主要是箱线图和核密度散点图
"""

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import seaborn as sns
from osgeo import gdal
from matplotlib.colors import LinearSegmentedColormap

# 准备
in_path = r'H:\Datasets\Objects\Veg\Plot\cor_by_st.csv'
dem_path = r'H:\Datasets\Objects\Veg\DEM\dem_1km.tif'
out_dir =r'H:\Datasets\Objects\Veg\Plot'
sns.set_style('darkgrid')  # 设置风格
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False  # 允许负号正常显示

# 加载数据
df = pd.read_csv(in_path)
dem = gdal.Open(dem_path)
dem_raster = dem.GetRasterBand(1).ReadAsArray()  # 获取dem栅格矩阵
dem_nodata_value = dem.GetRasterBand(1).GetNoDataValue()  # 获取无效值
lon_ul, lon_res, _, lat_ul, _, lat_res_negative = dem.GetGeoTransform()  # [左上角经度, 经度分辨率, 旋转角度, 左上角纬度, 旋转角度, -纬度分辨率]
lat_res = -lat_res_negative
iter_columns_name = df.columns[4:]
# 色带
colors = ['#ff0000', '#ff6f00', '#fbb700', '#cdff00', '#a1ff6e', '#52ffc7', '#00ffff', '#15acff', '#4261ff', '#3100fe']
colors.reverse()
cm = LinearSegmentedColormap.from_list('common', colors, 100)

# 添加DEM列
cols = np.floor((df['Lon'] - lon_ul) / lon_res).astype(int)
rows = np.floor((lat_ul - df['Lat']) / lat_res).astype(int)
df['DEM'] = dem_raster[rows, cols]
df[df['DEM'] == dem_nodata_value] = np.nan
# 绘制散点核密度图
for column_name in iter_columns_name:
    plt.figure(dpi=321)
    cur_ds = df[['DEM', column_name]].dropna(how='any')
    cur_ds['Density'] = gaussian_kde(cur_ds[column_name])(cur_ds[column_name])

    scatter = plt.scatter(x='DEM', y=column_name, c='Density', cmap=cm, linewidth=0, data=cur_ds)
    # scatter = sns.scatterplot(x='DEM', y=column_name, hue='Density', palette='viridis', linewidth=0, data=cur_ds)
    clb = plt.colorbar(scatter)
    clb.ax.set_title('Density', fontsize=8)  # 为色带添加标题
    sns.kdeplot(x='DEM', y=column_name, fill=False, color='gray', data=cur_ds, alpha=0.6)
    title_name = 'Scatter kernel density map of $R^2$ \n between NDVI and {} under DEM'.format(column_name)
    plt.title(title_name, fontsize=16)
    plt.xlabel('DEM', fontsize=14)
    plt.ylabel('$R^2$ between NDVI and {}'.format(column_name), fontsize=14)
    plt.xticks(fontsize=12)
    plt.yticks(fontsize=12)
    plt.savefig(os.path.join(out_dir, 'R2_{}.png'.format(column_name)))
    plt.show()
# 绘制箱线图
fig, axs = plt.subplots(4, 1, figsize=(13, 18), dpi=200)
axs = axs.flatten()
fig.suptitle('Box plot of NDVI and correlation coefficients of each variable', fontsize=30, va='top')
for ix, ax in enumerate(axs):
    # ax.figure(figsize=(26, 9), dpi=321)
    df_melt = pd.melt(df, value_vars=iter_columns_name[(ix * 9):((ix + 1) * 9)]).dropna(how='any')
    sns.boxplot(data=df_melt, x='variable', y='value', palette=cm(np.linspace(0, 1, 9)), ax=ax, linewidth=3)
    ax.set_xlabel('', fontsize=25)
    ax.set_ylabel('$R^2$', fontsize=25)
    ax.tick_params(axis='x', labelsize=18)  # x轴标签旋转90度
    ax.tick_params(axis='y', labelsize=18)
    ax.grid(True)
plt.tight_layout(pad=2)
fig.savefig(os.path.join(out_dir, 'Box_R2.png'))
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网:https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库,可商用。软件分为characters(角色)、Animations(动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网:https://terribilisstudio…

海外媒体发稿:新闻媒体发稿7种方法-华媒舍

新闻报道媒体发稿营销推广是当代企业形象宣传的重要手段之一,合理推广可以提升品牌知名度、吸引住潜在用户。在这篇文章中,我们将要详细介绍七种科学合理的形式,帮助你完全把握新闻报道媒体发稿营销推广。 1.明确目标群体明确目标群体是实现推…

阅读欣赏推荐之(三)——纪录片《地平线系列:大数据时代》

现今的我们正处于一个时代转型中,因为科技的发展与互联网的日益强大,数据将逐步取代旧事物,创造出新事物。当今社会以一种前所未有的方式,通过对海量数据进行分析,获得巨大价值的产品和服务,或深刻的洞见。…

SSM整合项目(显示+添加+修改家居)

文章目录 1.显示全部家居1.需求分析2.思路分析3.编写Service层1.FurnService.java 添加方法2.FurnServiceImpl.java 实现方法3.单元测试 4.编写Controller层1.FurnController.java 添加方法2.postman完成测试 5.前端展示家居1.HomeView.vue 修改el-table使其prop跟Furn的属性名…

PLC远程故障诊断

随着工业自动化水平的不断提升,可编程逻辑控制器(PLC)在生产线控制、设备自动化等领域发挥着越来越重要的作用。然而,PLC在运行过程中难免会出现故障,影响生产线的稳定运行。因此,如何迅速、准确地诊断并解…

有c语言基础,如何快速学会C++核心知识?

有c语言基础,如何快速学会C核心知识? 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些 电气工程师学习方法和资料,让我不断提…

Python deepFM推荐系统,推荐算法,deepFM源码实战,deepFM代码模板

1.DeepFM介绍: DeepFM(Deep Factorization Machine)是一种结合了深度学习和因子分解机的推荐模型。它在CTR(点击率)预测任务中表现出色,并能够有效地处理稀疏特征。 DeepFM模型由两个部分组成:因…

截断表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 截断表 事务处理本身是保护数据完整性的一个手段,但是在使用事务处理的过程之中需要注意一点 在用户更新数据后还未进行事务提交时,如果发生了 DDL…

1688 API接口在数据分析与营销决策中的应用探索

在当今数字化快速发展的时代,数据分析与营销决策已成为企业运营中不可或缺的重要环节。而1688 API接口,作为阿里巴巴旗下的一个强大的数据交互平台,为企业在数据分析与营销决策方面提供了丰富的数据源和灵活的操作方式。本文将深入探讨1688 A…

https代理相对socks5代理有什么优势?

随着互联网的快速发展,代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中,HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

RabbitMQ - 01 - 快速入门

目录 界面总览 创建队列 选择默认交换机 发布消息 查看消息 通过实现以下目标快速入门 界面总览 RabbitMQ Management 界面总览 通道: 传输消息的通道 路由: 接收和路由(分发)消息 队列: 存储消息 消息队列的流程: 生产者将消息发送给路由,路由分发消息到各个队列存储…

Android Kotlin知识汇总(四)Kotlin 协程实践

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程是一种并发设计模式,可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。 简单来说,协程就是一种轻量级的非…

Windows从0到1部署项目

文章目录 1.创建虚拟机2.文件的传输--共享文件夹共享文件夹的访问 3.安装jdk,Tomcat3.1jdk的安装与配置配置环境变量 3.2Tomcat的安装与配置 4.安装mysql数据库5.下载nginx6.虚拟域名 因为Windows项目部署有很多操作都是博主之前做过的了,所及就只放了博…

何恺明教授在MIT的第一课,双语字幕1080P看resnet作者亲自讲解resnet

这几天AI圈最火的话题莫过于何恺明大神在MIT的首场教学了 何恺明(Kaiming He)教授于3月7日走上讲台,完成了他在麻省理工学院的首场教学,这标志着他教学生涯中的一个重要时刻。作为麻省理工学院电气工程与计算机科学系&#xff08…

批处理自动找木马文件路径

背景:如果主机不多,应急有通报的木马病毒样本可能存在的路径,一个个翻就太累。 直接整成一个文档,如果存在那个可以着重主机了。当然木马查杀记录也不能忘记看下。 1. 双击打开 cmd.bat 2. 输入list.bat 3. 文件存在输出路径…

SQLiteC/C++接口详细介绍之sqlite3类(四)

上一篇:SQLiteC/C接口详细介绍之sqlite3类(三) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(五)(暂未发表) 编写不易,有用的朋友点个赞或加粉一下万分感谢!300…

three.js 按键W前进、S退后、A左转、D右转运动

效果&#xff1a;W 键 前进&#xff1b;S 键后退&#xff1b;A 键左转&#xff1b;D 键右转&#xff1b;使用了 tween.js 动画库&#xff1b; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left">&…

ctfshow-XXE(web373-web378)

目录 XXE&#xff08;外部实体注入攻击&#xff09; web373 web374 web375 web376 web377 web378 知识点 XXE&#xff08;外部实体注入攻击&#xff09; XXE这几关有个前提flag在根目录下文件名为flag web373 <?php error_reporting(0); libxml_disable_entity_…

商铺办理房产证需缴纳的交易费用有哪些材料?

一、商铺办理房产证收费标准 一般来说&#xff0c;商铺办理房产证时需要缴纳的交易费用包括&#xff1a;交易费、登记费、验资费、营业税、个人所得税、契税等。 每个城市的缴费标准会有所不同。 具体缴纳费用需要咨询当地房管局。 1、契税&#xff1a;房屋交易额的5%。 &…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…