网站首页 > 基础教程 正文
??本文介绍基于Python语言的matplotlib模块,对Excel表格文件中的指定数据,加以密度散点图绘制的方法。
??首先,明确一下本文的需求。
??现有一个.csv格式的表格文件,其各列数据的开头部分如下图所示。其中,对于名称为26的这1列(左侧紫色框内数据),我们希望提取其数值等于1的所有行,并对这些行中的NIR_predict列与NIR_true列(右侧紫色框内数据)的数值加以密度散点图的绘制。
??明确了需求,即可开始代码的撰写。本文所用代码如下。
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 1 12:14:38 2024
@author: fkxxgis
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
csv_file_path = r"E:\04_Reconstruction\99_MODIS\Train_Model_0715_Main_Combine.csv"
picture_file_path = r"E:\04_Reconstruction\99_MODIS\Scatter_result.png"
data = pd.read_csv(csv_file_path)
x = data[data["26"] == 1]['NIR_true']
y = data[data["26"] == 1]['NIR_predict']
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
idx = z.argsort()
plt.scatter(x, y, c = z, s = 10, cmap = "Spectral")
plt.colorbar()
plt.rc("font", family = "Times New Roman")
x_line = np.linspace(min(min(x), min(y)), max(max(x), max(y)), 100)
plt.plot(x_line, x_line, color='black', linestyle='--')
plt.xlabel('NIR_true')
plt.ylabel('NIR_predict')
plt.savefig(picture_file_path, dpi = 400)
plt.show()
??首先,我们通过import语句导入所需模块。其中,numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,scipy.stats.gaussian_kde用于计算核密度估计。
??其次,通过csv_file_path定义待绘图的.csv格式文件的路径,通过picture_file_path定义存储所得图片结果的路径。
??随后,使用pd.read_csv()从.csv格式文件中读取数据,并存储在名为data的DataFrame中。通过筛选条件data["26"] == 1从DataFrame中获取符合指定条件的数据,并分别存储在x和y中。
??接下来,使用np.vstack()将x和y垂直堆叠为一个二维数组xy,并使用scipy.stats.gaussian_kde()计算二维数据的核密度估计值,并将其存储在z中;使用z.argsort()对z进行排序,返回索引值,并将其存储在idx中。使用plt.scatter()绘制散点图,其中x和y是散点的横纵坐标,c是颜色值,s是散点的大小,cmap是颜色映射,并使用plt.colorbar()添加颜色条。
??紧接着,使用plt.rc()设置字体为Times New Roman;随后,生成一条直线的横坐标范围,使用np.linspace()生成一系列横坐标值,并存储在x_line中;这些点将组成后续所得散点图中的x = y线;使用plt.plot()绘制直线,颜色为黑色,线型为虚线。此外,使用plt.xlabel()和plt.ylabel()添加x轴和y轴的标签,使用plt.savefig()将图形保存为指定路径的图片文件,设置dpi值为400。最后,使用plt.show()显示图形。
??执行上述代码,即可在结果文件夹中看到所得图片;如下图所示。
??可以看到,我们已经绘制得到了指定数据之间的密度散点图。当然,我这里所选色带,将密度较低的区域标记为红色系,密度较高的区域标记为了蓝色系,可能和一般情况下大家常用的色系相反——我是一开始选错了,后面也没有修改,这里大家理解即可;如果需要修改这个色系,大家修改上述代码中的cmap = "Spectral"部分即可。
??至此,大功告成。
欢迎关注:疯狂学习GIS
- 上一篇: 再见了,Python~
- 下一篇: 分享一个Python脚本--判断101-200之间有多少个素数?
猜你喜欢
- 2024-12-12 再见了,Python~
- 2024-12-12 一文带您理解Python生成器(generator):高效利用内存的奥秘
- 2024-12-12 Python中的线程
- 2024-12-12 Python元组介绍:10分钟掌握元组用法
- 2024-12-12 基于OpenCV 的车牌识别
- 2024-12-12 Python每日一练之判断101-200之间有多少个素数,并输出所有素数
- 2024-12-12 在 Python 字典中查找包含最小值的键
- 2024-12-12 20_ Python基础到实战一飞冲天(二)-python基础(二十)
- 2024-12-12 是时候学习Web开发了,1小时用Python开发一个博客系统
- 2024-12-12 怎样用Python进行数据转换和归一化
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)