Matplotlab绘制散点图小节

news/2025/1/3 1:58:13/

前言

现有一堆数据,是散点坐标形式,现在需要将它们绘制成散点图,并解决了关于Matplotlib绘图不能显示汉字的问题。

    • 读取数据

数据格式如下图。

第一行为一个数字,表示当前文件共有多少行数据。 第二行开始为真正的数据,各数据间以一个Tab分隔。第一列是数据点ID名,第二列是X坐标,第三列是Y坐标,第四、五列暂时用不到,不用管它。第六列是垂轨误差,第七列是沿轨误差。我们要画的一共是4个图,即X方向的垂轨误差图、X方向的沿轨误差图、Y方向的垂轨误差图、Y方向的沿轨误差图。简单解释一下例如X方向的垂轨误差图就是以读取的X坐标为X轴,垂轨误差为Y轴绘制散点图。要使用Matplotlab绘图需要两步,第一步是读取数据,第二部是调用函数绘图。

由于上面介绍的数据格式是我们自己定义的,并没有任何通用的函数可以读取,所以只能自己写个小函数读取。好在Python读取文本文件还是挺简单的,下面直接上代码。

def readData(file_path):# 打开一个文本文件text_file = open(file_path)data_item = []# x轴垂轨数据x_ev = []# x轴沿轨数据x_eh = []# y轴垂轨数据y_ev = []# y轴沿轨数据y_eh = []# 先读取第一行,读取时注意去掉行尾的换行符line = text_file.readline().strip('\n')# 然后逐行读取数据while line:line = text_file.readline().strip('\n')# 如果读取的行内容不为空,则添加到list中# 注意这里并不能用None,注意空字符串和空对象的区别if line != '':data_item.append(line)# 读取完成后对于读取的每行数据进行简单的提取和处理for i in range(data_item.__len__()):data = data_item[i].split('\t')x_coordinate = float(data[1])y_coordinate = float(data[2])error_vertical = float(data[5])error_horizontal = float(data[6])x_ev.append([x_coordinate, error_vertical])x_eh.append([x_coordinate, error_horizontal])y_ev.append([y_coordinate, error_vertical])y_eh.append([y_coordinate, error_horizontal])# 由于原始数据中坐标并没有进行排序,因此这里进行排序x_ev.sort()x_eh.sort()y_eh.sort()y_ev.sort()return x_ev, x_eh, y_ev, y_eh

在读取数据完成后,下面就是用Matplotlab绘图了。

2.Matplotlab绘图

由于我们需要画四个图,因此可以采用subplot的方式绘制。代码较为简单,基本一看就能知道是什么含义,所以直接贴出来。如果有需要,直接修改相关内容即可。

# 设置绘图的大小(格网)
plt.figure(figsize=(16, 10))# 221表示分成2行2列,占用第一块(1行1列)
plt.subplot(221)
plt.title("Rule of residual errors across the track")
plt.xlabel("X")
plt.ylabel("Errors(pixels)")
# 是否显示格网
plt.grid(True)
# s表示散点大小,alpha表示透明度,c表示颜色
points = plt.scatter(np.array(x_ev)[:, 0],np.array(x_ev)[:, 1],s=1,alpha=0.5,c='r')
plt.legend([points], ['Across Track Error'])# 221表示分成2行2列,占用第三块(2行1列)
plt.subplot(223)
plt.title("Rule of residual errors along the track")
plt.xlabel("X")
plt.ylabel("Errors(pixels)")
plt.grid(True)
points = plt.scatter(np.array(x_eh)[:, 0],np.array(x_eh)[:, 1],s=1,alpha=0.5)
plt.legend([points], ['Along Track Error'])# 221表示分成2行2列,占用第二块(1行2列)
plt.subplot(222)
plt.title("Rule of residual errors across the track")
plt.xlabel("Y")
plt.ylabel("Errors(pixels)")
plt.grid(True)
points = plt.scatter(np.array(y_ev)[:, 0],np.array(y_ev)[:, 1],s=1,alpha=0.5,c='r')
plt.legend([points], ['Across Track Error'])# 221表示分成2行2列,占用第四块(2行2列)
plt.subplot(224)
plt.title("Rule of residual errors along the track")
plt.xlabel("Y")
plt.ylabel("Errors(pixels)")
plt.grid(True)
points = plt.scatter(np.array(y_eh)[:, 0],np.array(y_eh)[:, 1],s=1,alpha=0.5)
plt.legend([points], ['Along Track Error'])# 最后保存绘图,dpi越高图像质量越好
plt.savefig('figure', dpi=600)
plt.show()

最终,绘制效果如下。由于上传时压缩等问题,看起来效果没那么好了。原图是9600×6000带透明度的png图像,有8.67MB大小

不得不说Matplotlab是科研绘图利器,使用Matplotlab绘制出的图像质量还是比较高的,抗锯齿等等方面要优于一些老版本的Matlab,但是绘制代码其实和Matlab差不多。

3.问题汇总

关于Matplotlib绘图不能显示汉字的问题,在代码中添加下面两句话即可:

# 支持中文
font_name = "SimHei"  # 字体名称,这里默认用黑体
plt.rcParams['font.sans-serif'] = [font_name]  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

然后就可以在绘图中显示中文了,还有一个需要注意的地方就是绘图时传入的字符串必须是Unicode字符串(字符串前面加u),不能是普通默认编码字符串,否则会报错,还是显示不了。实际测试代码段如下:

# coding=utf-8
from matplotlib import pyplot as pltif __name__ == '__main__':font_name = "SimHei"plt.rcParams['font.sans-serif'] = [font_name]plt.rcParams['axes.unicode_minus'] = Falsex = [1, 5]y = [2, 7]# 手动设置字体font = {'family': font_name,'weight': 'normal','size': 14,}plt.title(u"测试图例", font)plt.xlabel(u"x轴", font)plt.ylabel(u"y轴", font)plt.plot(x, y)plt.show()

效果如下。


http://www.ppmy.cn/news/12921.html

相关文章

2023牛客寒假算法基础集训营1

第一场题目比较简单,有蛮多诈骗题的,难的题目只有B,I,J之后慢慢补。 简单题 A.World Final? World Cup! (I) (模拟) 题意思路 模拟题,每队轮流踢555个球,看哪个球队踢完这球后,按最好的情况…

Vector - VT System - 模拟IO板卡_VT2816

前面介绍了模拟量的输入板卡VT2004,今天我们介绍的这个板卡依然是模拟量的输入,具体使用场景可能要我们根据实际的使用场景去进行选择。VT2004更偏向于激励,而VT2816更偏向于通用模拟量的IO使用,下面我们从功能、参数、硬件结构等…

如何用一把锁保护多个资源?

上一篇中提到受保护的资源和锁之间合理的关联关系应该是N:1的关系,也就是说可以用一把锁来保护多个资源,但是不能用多把锁来保护一个资源。 当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。 保护没有关联关系的多个资源 我们…

初读《编程之美》就想秀一下,结果还翻车了

文章目录 一、前言 二、我的思路 三、Code 四、翻车现场 五、后续问题 一、前言 ———如何写一个短小的程序,让 Windows 的任务管理器显示CPU的占用率为50%? 这道有趣的面试题我是这两天从《编程之美》电子版中看到的,看意思就是邹老师在微软对一…

【实践向】当移除了三级缓存……

本文会手把手带你一起把使用二级缓存替换三级缓存,看下移除了三级缓存,只有二级缓存会出什么问题,用实践回答那个被问了无数次的“为什么要有三级缓存?”以及“二级缓存解决不了循环依赖问题吗?”等类似问题(&#xff…

大数据技术包括哪些

大数据技术,就是从各种类型的数据中快速获得有价值信息的技术。大数据领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。大数据处理关键技术一般包括:大数据采集、大数据预处理、大数据存储及管理、大数据分析…

详细实例说明+典型案例实现 对迭代法进行全面分析 | C++

第四章 迭代法 目录 ●第四章 迭代法 ●前言 ●一、迭代法是什么? 1.简要介绍 2.代码示例(简单理解) 3.生活实例 ●二、迭代法的典型案例——开平方&帕斯卡三角形 1.开平方 2.帕斯卡三角形 ●总结 前言 简单的来…

Linux调试器-gdb使用

目录 1. 背景 2. 开始使用 3. 理解 创建需要调试的代码 debug&&release 4 详细调试 list/l 行号 list/l 函数名 r或run break(b) info b(reak) d num disable breakpoints enable breakpoints n (next) s(step) breaktrac…