前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >散点图

散点图

作者头像
客怎眠qvq
发布2022-11-01 15:37:41
1.2K0
发布2022-11-01 15:37:41
举报
文章被收录于专栏:某菜鸟の小屋

前言

源数据是一个data.txt

某憨憨用的matlab,不会导出为xls、csv等pandas库可以处理的文件,我对你很无语……

代码语言:javascript
复制
xlswrite('test.csv')
csvwrite('test.csv')

操作步骤

转换为csv文件后,会得到如下的一个表格;

读取数据

如果直接读取data.txt的话,可以使用如下代码:

代码语言:javascript
复制
import pandas as pd
df = pd.read_table('data2010.txt', names=['time', 'test','formal', 'color'], header=None, sep=" ") 

如果是在test.csv的基础上操作,可使用如下代码:

代码语言:javascript
复制
df = pd.read_csv('test.csv')

需求分析

  • 需要计算标准数据与实际测量数据的偏差(bias)、均方根误差(RMSE)、散射指数(SI)三个值
  • 需要根据点坐标(标准值,实际值)绘制散点图
  • 需要根据点密度绘制不同颜色的散点分布图 效果应如下图所示:

具体实现

三个公式的计算

代码语言:javascript
复制
# 分别对 测量值 和 标准值 求和
ans_test = sum(df['test'])
ans_formal = sum(df['formal'])
# bias
DelBias = ans_test - ans_formal
bias = DelBias / len(df)

# rmse
rmse = np.sqrt(sum((df['test'] - df['formal'])**2) / len(df))

# 测量值均值
test_mean = ans_test / len(df)
# 标准值均值
formal_mean = ans_formal / len(df)

# SI
SI = np.sqrt(sum(((df['test'] - test_mean) - (df['formal'] - formal_mean)) ** 2) / len(df)) / formal_mean

坐标轴的格式规范

代码语言:javascript
复制
# 正确显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=True # 用来正常显示负号

# 生成图的设置 包括坐标轴、色块范围、间距等
plt.xlabel('浮标数据', fontsize=14)
plt.ylabel('卫星检测数据', fontsize=14)
plt.title('Data2010', fontsize=14)

# 设置刻度间距
x_major_locator = MultipleLocator(1)
y_major_locator = MultipleLocator(1)

# ax为两条坐标轴的实例
ax = plt.gca()

# 显示主刻度 均为1的倍数
ax.xaxis.set_major_locator(x_major_locator)
ax.yaxis.set_major_locator(y_major_locator)

# 规定x y 轴的刻度范围
plt.xlim(0, 10)
plt.ylim(0, 10)

普通散点图

代码语言:javascript
复制
df.plot.scatter(x='formal', y='test')

彩色散点图

  • 根据每对数据的偏差,人为划分颜色
代码语言:javascript
复制
# 已知 数据的偏差 绝对值为 0.08
bias = abs(bias)
for i in range(len(df)):
    delData = abs(df['test'][i] - df['formal'][i])
    # 人为划定范围 10倍、20倍等 可自定义修改 
    if delData == 0:	
        df['color'][i] = 0
    elif(delData <= 10 * bias):
        df['color'][i] = 1
    elif delData <= 20 * bias:
        df['color'][i] = 2
    elif delData <= 30 * bias:
        df['color'][i] = 3
    else:
        df['color'][i] = 4
代码语言:javascript
复制
# 由偏差 绘制散点图
df.plot.scatter('formal', 'test', c='color', colormap='jet')
  • 根据点密度绘制散点图
代码语言:javascript
复制
# 将x y转为一维
data_test = []
data_formal = []
for i in range(len(df)):
    data_test.append(df['test'][i])
    data_formal.append(df['formal'][i])
    
# 由点密度绘制散点图 hist2d
plt.hist2d(data_formal, data_test, bins=100, cmin=1, vmin=1, vmax=10, cmap='jet')
代码语言:javascript
复制
- 关于hist2d的参数
plt.hist2d(x, y, bins=100, cmin=1, vmin=1, vmax=10, cmap='jet')

x y 为x轴 y轴的数据 且均为一维矩阵 如:[1, 2, 3, 4]
bins 表示两个维度的箱数(若bins=40, nx=ny=bin | 若bins=[10,20], nx=10,ny=20) 
个人认为 可以理解为 x y轴被切割成的份数

cmin、cmax浮点 所有计数小于cmin或超过cmax 将不显示 这个参数很好理解 筛选一定计数范围的点

cmap 颜色映射 就是我们所使用的颜色集合 无他 为了好看
具体的映射参数 可查看这位博主的文章 https://blog.csdn.net/weixin_39580795/article/details/102622004

vmin/vmax 官方解释为:vmin/vmax 无或标量,可选 传递给的参数 Normalize 实例。
官方文档:https://www.osgeo.cn/matplotlib/api/_as_gen/matplotlib.pyplot.hist2d.html
个人在调试时 理解为对所生成散点图色彩范围的划分 vmin-vmax的范围越大,各个颜色的划分便越精细

效果展示

代码

代码语言:javascript
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator


df = pd.read_csv('test.csv')

ans_test = sum(df['test'])
ans_formal = sum(df['formal'])

# bias
bias = ans_test - ans_formal
bias = bias / len(df)

bias = abs(bias)
for i in range(len(df)):
    delData = abs(df['test'][i] - df['formal'][i])
    if delData == 0:
        df['color'][i] = 0
    elif(delData <= 10 * bias):
        df['color'][i] = 1
    elif delData <= 20 * bias:
        df['color'][i] = 2
    elif delData <= 30 * bias:
        df['color'][i] = 3
    else:
        df['color'][i] = 4

# 由bias绘制散点图
df.plot.scatter('formal', 'test', c='color', colormap='jet')
plt.title('formal-test')
plt.show()


# 由密度绘制散点图 hist2d
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=True # 用来正常显示负号

data_test = []
data_formal = []
for i in range(len(df)):
    data_test.append(df['test'][i])
    data_formal.append(df['formal'][i])


plt.hist2d(data_formal, data_test, bins=100,
           cmin=1, vmin=1, vmax=10, cmap='jet')
plt.tick_params(axis='both', which='major', labelsize=14)

# 坐标轴名称
plt.xlabel('浮标数据', fontsize=14)
plt.ylabel('卫星检测数据', fontsize=14)
plt.title('Data2010', fontsize=14)

# 设置刻度间距
x_major_locator = MultipleLocator(1)
y_major_locator = MultipleLocator(1)

# ax为两条坐标轴的实例
ax = plt.gca()

# 显示主刻度 均为1的倍数
ax.xaxis.set_major_locator(x_major_locator)
ax.yaxis.set_major_locator(y_major_locator)

# 规定x y 轴的刻度范围
plt.xlim(0, 10)
plt.ylim(0, 10)

plt.colorbar()
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 操作步骤
    • 读取数据
      • 需求分析
        • 具体实现
        • 效果展示
        • 代码
        相关产品与服务
        文件存储
        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档