【头歌-Python】9.1 X射线衍射曲线绘制(project)第3~4关

news/2025/1/8 19:39:07/

第3关:X 射线衍射曲线峰值

任务描述

本关任务:读文件中的数据绘制线图形并加绘制峰值。

相关知识

为了完成本关任务,你需要掌握:

  1. python 读取文件中的数据
  2. 使用 matplotlib 绘制图形

python 读取文件
python读取文件可以用以下函数实现:

def read_file(file):""" 读文件file, 返回值为二维列表,其中数据是字符串类型。 """with open(file, 'r', encoding='utf-8') as file:data_list = [line.strip().split() for line in file]return data_list

读为数值类型

def read_file(file):""" 读文件file, 返回值为二维列表,其中数据是数值类型。 """with open(file, 'r', encoding='utf-8') as file:data_list = [list(map(float,line.strip().split())) for line in file]return data_list

编程要求

根据提示,在右侧编辑器中补充代码,绘制 X 射线衍射峰值图。具体要求如下:

  1. 找出最高的5个峰,输出峰点坐标,
  2. 在图上标注峰点的纵坐标值,坐标值从数据中读取,参数参模板中要求。
  3. 绘制横坐标[5,25]之间的曲线图
  4. 图名为“X射线衍射图谱”
  5. 纵坐标标签为“Intensity”,横坐标标签为“2d”,
  6. 设置线颜色为“红色”,实线。
  7. 绘制红色破折线为横坐标轴,
  8. 要求中文显示正常,宋体’SimSun’,字号用默认值。

测试说明

平台会对你编写的代码进行测试:

输出示例:
在这里插入图片描述

参考代码

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = Falsedef read_file(file):""" 读文件file, 返回值为二维列表,其中数据是字符串类型。 """with open(file, 'r') as f:data_list = [list(map(eval, line.strip().split())) for line in f.readlines()[1:]]return data_listdef top_five_peak(data_list):"""参数为读文件获得的数据列表,返回纵坐标值最大的5个峰的坐标的列表,降序排序。"""res = sorted(data_list, key=lambda x:x[1], reverse=True)return res[:5]def plot_xrd(data_list):"""接收二维列表为参数,绘制曲线,红色实线"""x = [d[0] for d in data_list]y = [d[1] for d in data_list]plt.plot(x, y, 'r')def mark_peak(peak_ls):"""参数为峰值数据列表,在指定的坐标点加注释。注释标记点相对横坐标偏移+30,纵坐标等高,注释文本为峰高,即y 值,注释文本字号为12,箭头类型"->"。"""for x, y in peak_ls:plt.annotate(f'{y}', xy=(float(x), float(y)), xytext=(+30, 0),textcoords='offset points', fontsize=12,arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))def add_label():"""增加坐标轴标识与图名"""plt.xlim(5, 25)plt.axhline(0, linestyle='--', color='b')plt.title("X射线衍射图谱")plt.xlabel("2d")plt.ylabel("Intensity")if __name__ == '__main__':data = read_file('XRD_AFO.txt')peak_lst = top_five_peak(data)plot_xrd(data)mark_peak(peak_lst)add_label()plt.savefig('result/result.jpg')plt.show()

第4关:X 射线衍射曲线多子图绘制

任务描述

本关任务:使用matplotlib绘制图形。

相关知识

为了完成本关任务,你需要掌握:

  1. python 读取文件中的数据
  2. 多子图绘图

python 读取文件
python读取文件可以用以下函数实现:

def read_file(file):""" 读文件file, 返回值为二维列表,其中数据是字符串类型。 """with open(file, 'r', encoding='utf-8') as file:data_list = [line.strip().split() for line in file]return data_list

读为数值类型

def read_file(file):""" 读文件file, 返回值为二维列表,其中数据是数值类型。 """with open(file, 'r', encoding='utf-8') as file:data_list = [list(map(float,line.strip().split())) for line in file]return data_list

编程要求

根据提示,在右侧编辑器中补充代码,绘制 X 射线衍射曲线区域图。具体要求如下:

将画布分为三个区域,上面一个区域绘制完整XRD曲线,设置x轴范围为[5, 25]; 下面两个区域各放置x轴范围为[6.7, 7.0]和x轴范围为[9.5, 10.0]的局部放大图,使用户可以清晰的查看重叠的峰的区域。
提示:
第一个子图的绘制要求与第3关相同

测试说明

平台会对你编写的代码进行测试:

输出示例:
在这里插入图片描述

参考代码

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = Falsedef read_file(file):""" 读文件file, 返回值为二维列表,其中数据是字符串类型。 """with open(file, 'r') as f:data_list = [list(map(eval, line.strip().split())) for line in f.readlines()[1:]]return data_listdef top_five_peak(data_list):"""参数为读文件获得的数据列表,返回纵坐标值最大的5个峰的坐标的列表,降序排序。"""res = sorted(data_list, key=lambda x:x[1], reverse=True)return res[:5]def plot_xrd(data_list):"""接收二维列表为参数,绘制曲线,红色实线"""x = [d[0] for d in data_list]y = [d[1] for d in data_list]plt.subplot(211)plt.plot(x, y, 'r')add_label()def mark_peak(peak_ls):"""参数为峰值数据列表,在指定的坐标点加注释。注释标记点相对横坐标偏移+30,纵坐标等高,注释文本为峰高,即y 值,注释文本字号为12,箭头类型"->"。"""for x, y in peak_ls:plt.annotate(f'{y}', xy=(float(x), float(y)), xytext=(+30, 0),textcoords='offset points', fontsize=12,arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))def add_label():"""增加坐标轴标识与图名"""plt.xlim(5, 25)plt.axhline(0, linestyle='--', color='b')plt.title("X射线衍射图谱")plt.xlabel("2d")plt.ylabel("Intensity")def sub_xrd(data_list):"""接收二维列表为参数,在第二行第1和2列绘制x值在[6.7, 7.0]和[9.5, 10]间曲线"""x = [d[0] for d in data_list]y = [d[1] for d in data_list]plt.subplot(223)plt.plot(x, y, 'b')plt.xlim(6.7, 7.0)plt.subplot(224)plt.plot(x, y, 'b')plt.xlim(9.5, 10)if __name__ == '__main__':data = read_file('XRD_AFO.txt')peak_lst = top_five_peak(data)plot_xrd(data)mark_peak(peak_lst)sub_xrd(data)plt.savefig('result/result.jpg')plt.show()

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

相关文章

【C++】是内存管理,但C++ !! 模板初阶

目录 一,回望C语言内存 二, C 内存管理方式 1. 内置类型 2. 自定义类型 3. new & malloc 返回内容区别 4. operator new & operator delete 5. malloc/free和new/delete的区别总结 6. 定位new表达式(placement-new) (了…

AOC U2790PQU 评测

这款显示器的分辨率同样为4K,除了浏览照片和进行后期调色外,制图、剪辑视频时,都能获得更为清晰、锐利的细节,而IPS面板本身的广视角特性也几乎让使用者能够从任何一个角度看清屏幕。 AOC U2790PQU怎么样这些点很重要 http://www.…

AOC有什么用

AOC是 "Active Optical Cable" 的缩写,它是一种光学电缆,可以将视频、数据和音频信号以光纤的形式传输。这种电缆的优点是传输速度快、传输距离远、信号传输稳定、耐用性好,适用于各种高清视频传输应用。

计算机屏幕很暗怎么办,如果aoc显示屏的亮度很暗怎么办

有时候我们的aoc监视器很暗,我们该怎么办?让我们向编辑学习,为深色aoc显示器提供一个简单的解决方案!希望你喜欢它! 黑暗aoc显示的解决方案: 打开控制面板,然后单击“系统和安全性”. 单击以更改电池设置. …

Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】

上一章: Django实现接口自动化平台(七)数据库设计_做测试的喵酱的博客-CSDN博客 下一章: 官方文档: Serializers - Django REST framework 一、测试报告reports序列化器及视图 1.1 序列化器 apps/reports/serial…

一文讲透彻!RobotFramwork测试框架教程(全能)

Robot Framwork在业界早已名声大振!有很多刚学自动化测试的伙伴问我:有没有不需要编程就可以玩自动化的方法? 有吗?有的!——Robot Framwork 我们今天就一篇文章,把它讲得明明白白! 一、Robo…

huggingface lfs下载小技巧

先clone下来,然后再git lfs pull 明显要快得多。

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布

2023年6月12日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中,1Panel进一步增强了安全方面的能力,包括新增SSH配置管理、域名绑定和IP授权支持,以及启用网站防盗链功能。此外,该版本…