【头歌-Python】9.2 能带曲线绘制(project) 第1~3关

第1关:能带曲线绘制一

任务描述

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

相关知识

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

  1. 使用 matplotlib 绘制图形
  2. python 读取文件

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

# 读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中
def read_file(file):
    """
    @参数 file:文件名,字符串
    读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。
    返回值为二维列表,其中数据是浮点数类型。
    """
    with open(file, 'r', encoding='utf-8') as file:
        data_list = [list(map(float, line.strip().split('\t'))) for line in file]
    return data_list 

编程要求

  • 数据下载:
    band.txt
  • 根据提示,在右侧编辑器补充代码,绘制图形,具体要求如下:
  1. 绘制能带曲线图,线条颜色、粗细由系统默认,均为实线。
  2. 文件中的能带曲线数据有 2 列,分别代表坐标的(x, y)值。整个文件中的数据分为多组,每组数据 x 值范围从 0 增加到 1.0,每组数据可以绘制一条能带曲线。
  3. 重复读取各组数据,便可以绘制全部的能带曲线了。
  4. 绘制结果写入到文件"result/result.jpg"中

测试说明

平台会对你编写的代码进行测试:
在这里插入图片描述

参考代码

import matplotlib.pyplot as plt

def read_file(file):
    """参数文件名读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。  
    返回值为二维列表。 """
    with open(file, 'r', encoding='utf-8') as f:
    	res = []
        for line in f.readlines():
            res.append(line.strip().split('\t'))
    	return res

def plot_band(band_data):
    """参数数据是二维列表,x值从0-1的变化数据为一组,分组读取数据并绘制全部曲线"""
    x, y = [], []
    for data in band_data:
        x.append(eval(data[0]))
        y.append(eval(data[1]))
        if data[0] == '1':
            plt.plot(x, y)
            x, y = [], []
            
if __name__ == '__main__':
    filename = 'band.txt'
    data = read_file(filename)        # 读文件到二维列表
    plot_band(data)                 # 调用函数绘制曲线
    plt.savefig("result/result.jpg")  # 保存成图片
    plt.show()  

第2关:能带曲线绘制二

任务描述

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

相关知识

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

  1. 显示中文;
  2. python 读取文件
  3. 使用 matplotlib 绘制图形;
    显示中文
    设置中文字体和负号显示问题如下:
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False

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

# 读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中
def read_file(file):
    """读文件file,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。
    返回值为二维列表,其中数据是浮点数类型。
    """
    with open(file, 'r', encoding='utf-8') as file:
        data_list = [list(map(float, line.strip().split('\t'))) for line in file]
    return data_list 

或先以字符串形式加入列表,使用再转为数值:

def read_file(file):
    """读文件file,根据制表符'\t'将每行数据切分为列表再加入到列表中。返回值为二维列表,其中数据是字符串类型。 """
    with open(file, 'r', encoding='utf-8') as file:
        data_list = [line.strip().split('\t') for line in file]
    return data_list 

编程要求

根据提示,在右侧编辑器 Begin-End 区间中补充代码,绘制图形,具体要求如下:

  1. 一般来说,费米面附近的能带对性质影响最大,所以科学家只关心纵坐标为0的直线附近的能带曲线,用户输入用空格分隔的两个浮点数,用于确定一个纵坐标为 0 附近的区间,绘制纵坐标这个区间之间的能带曲线,

  2. 加图名“能带曲线图谱”,字体为’SimSun’,横坐标标签“k”,纵坐标标签“E(ev)”,在 y=0 处绘制一条直线,线型为虚线,红色。例如用户输入-5.0 5.0,绘制如下图形,相当于将处于这个区间的图形纵向拉伸放大,使曲线的弯曲程度更明显。

测试说明

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

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

参考代码

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False

def read_file(file):
    """参数文件名读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。  
    返回值为二维列表。 """
    with open(file, 'r', encoding='utf-8') as f:
    	res = []
        for line in f.readlines():
            res.append(line.strip().split('\t'))
    	return res

def plot_band(band_data, m, n):
    """参数数据是二维列表,x值从0-1的变化数据为一组,分组读取数据并绘制全部曲线"""
    x, y = [], []
    for data in band_data:
        x.append(eval(data[0]))
        y.append(eval(data[1]))
        if data[0] == '1':
            if len([i for i in y if not m<=i<=n])==0:
            	plt.plot(x, y)
            x, y = [], []
            
def plot_label():
    """绘制坐标标签、图名与x轴"""
    plt.axhline(0, linestyle='--', color='r')
    plt.title('能带曲线图谱')
    plt.xlabel('k')
    plt.ylabel('E(ev)')

if __name__ == '__main__':
    filename = 'band.txt'
    data = read_file(filename)  # 读文件到二维列表
    min_value, max_value = map(float, input().split())  # 输入数据范围
    if min_value > max_value:
        min_value, max_value = max_value, min_value
    plot_band(data, min_value, max_value)  # 调用函数绘制曲线
    plot_label()
    plt.savefig("result/result.jpg")  # 保存成图片
    plt.show()

第3关:能带曲线绘制(拓展)

任务描述

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

相关知识

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

  1. 使用 matplotlib 绘制图形;
  2. python 读取文件。

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

# 读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中
def read_file(file):
    """
    @参数 file:文件名,字符串
    读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。
    返回值为二维列表,其中数据是浮点数类型。
    """
    with open(file, 'r', encoding='utf-8') as file:
        data_list = [list(map(float, line.strip().split('\t'))) for line in file]
    return data_list 

编程要求

根据提示,在右侧补充代码,绘制图形,具体要求如下:

  1. 找出纵坐标大于0的曲线上的最低点A的坐标,标注该点为“bottom of conduction band”。

  2. 找出纵坐标小于0的曲线上、与A点相同横坐标的最高点B的坐标,标注该点为“top of valence band”。

  3. 计算并输出A、B之间的距离(A,B横坐标相同),用灰色虚线连接A,B两点。输出导带底坐标、价带顶坐标和带隙。

测试说明

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

  • 输入示例: -5.0 5.0

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

参考代码

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False

def read_file(file):
    """参数文件名读文件,根据制表符'\t'将每行数据切分为列表再加入到列表中将数据映射为浮点数类型。  
    返回值为二维列表。 """
    with open(file, 'r', encoding='utf-8') as f:
    	res = []
        for line in f.readlines():
            res.append(line.strip().split('\t'))
    	return res

def plot_band(band_data, m, n):
    """参数数据是二维列表,x值从0-1的变化数据为一组,分组读取数据并绘制全部曲线"""
    x, y = [], []
    for data in band_data:
        x.append(eval(data[0]))
        y.append(eval(data[1]))
        if data[0] == '1':
            if len([i for i in y if not m<=i<=n])==0:
            	plt.plot(x, y)
            x, y = [], []

def bottom_top_band(data_list):
    """参数是浮点数的二维列表,定位导价底和价带顶的坐标。导带底为纵坐标大于0的部曲线最低点,
    价带顶为纵坐标小于0 的曲线最高点,一般导带底与价带顶相对,即横坐标相同。以元组形式返回导带底坐标和价带顶坐标 """
    Min = (0, 1000)
    for data in data_list:
        d = eval(data[1])
        if 0<d<Min[1]:
            Min = (data[0], d)
            
    Max = max([eval(d[1]) for d in data_list if d[0]==Min[0] and eval(d[1])<0])
    return (eval(Min[0]), Min[1]), (eval(Min[0]), Max)

def gap_of_band(bottom, top):
    """bottom纵坐标大于0的部曲线最低点坐标;top纵坐标小于0 的曲线最高点坐标
    接收导带底和价带顶的数值,带隙为导带底和价带顶纵坐标之差,返回带隙值。 """
	return #该函数在本题中似乎没有用

def mark_peak(bottom_top):
    """绘制注释,在y值大于0的部分找到曲线最低点,标注'bottom of conduction band'
    在y值小于0的部分找到曲线最高点,标注'top of valence band'。 绘制导带底到价带顶连线,灰色破折线 """
    plt.plot([bottom_top[0][0], bottom_top[1][0]], [bottom_top[0][1], bottom_top[1][1]], linestyle='--', color='gray') 
    plt.annotate(r'bottom of conduction band', xy=bottom_top[0], xytext=(-200, -20),
                 textcoords='offset points', fontsize=12,
                 arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
    plt.annotate(r'top of valence band', xy=bottom_top[1], xytext=(0, 15),
                 textcoords='offset points', fontsize=12,
                 arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
            
def plot_label():
    """绘制坐标标签、图名与x轴"""
    plt.axhline(0, linestyle='--', color='r')
    plt.title('能带曲线图谱')
    plt.xlabel('k')
    plt.ylabel('E(ev)')
    
if __name__ == '__main__':
    filename = 'band.txt'
    data = read_file(filename)  # 读文件到二维列表
    min_value, max_value = map(float, input().split())  # 输入数据范围
    if min_value > max_value:
        min_value, max_value = max_value, min_value
    plot_band(data, min_value, max_value)  # 调用函数绘制曲线
    bottom_to_top = bottom_top_band(data)
    mark_peak(bottom_to_top)
    plot_label()
    bottom_top_band(data)
    plt.savefig("result/result.jpg")  # 保存成图片
    plt.show()

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

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

相关文章

Java学习笔记(视频:韩顺平老师)4.0

如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 因为作者能力水平有限&#xff0c;欢迎各位大佬指导。 目录 如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 控制结构 顺序 分…

用了【WRITE-BUG数字空间】,其他文档软件可以卸载、注销账号了

都3202年了文档都进化成在线协同编辑文档了 让我看看谁还在用本地软件写文档啊~滋滋滋 使用【WRITE-BUG数字空间】云文档全键盘写作不是梦&#xff01;铁汁&#xff0c;听我句劝&#xff0c;把本地软件卸载了奥&#xff0c;你把握不住~ 程序员兄弟姐妹们的最爱编辑器&#x…

TCP协议流程详解,抓包分析

目录 TCP概念TCP工作层TCP协议头部解析TCP抓包解析TCP三次握手&#xff0c;数据收发&#xff0c;四次挥手抓包TCP状态迁移 TCP概念 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&…

【2023年计划大纲】2023年技术笔记大纲

2023年技术笔记写作计划 按照技术类型&#xff0c;计划写以下三个领域的笔记&#xff1a; &#xff08;1&#xff09;AUTOSAR标准体系的专业知识&#xff0c;T-BOX,BMS,VCU这几个产品的设计和核心开发。包括UDS协议&#xff0c;XCP协议&#xff0c;OS操作系统。 每一个产品和…

Spring Cloud Kubernetes配置使用详情

目录 一、 为什么你需要 Spring Cloud Kubernetes&#xff1f; 二、 Starter 三、 用于 Kubernetes 的 DiscoveryClient 四、Kubernetes 原生服务发现&#xff08;service discovery&#xff09; 五、Kubernetes PropertySource 的实现 1、使用 ConfigMap PropertySource …

【HTML】form标签

<form> 标签用于创建 HTML 表单&#xff0c;它是用于收集用户输入的重要元素。表单可以包含各种输入字段、按钮和其他交互元素&#xff0c;用于向服务器发送用户输入数据。 下面是一个简单的 <form> 标签的示例&#xff1a; <form action"/submit-form&q…

释放 OpenAI 和 ESP-BOX 的力量:ChatGPT 与乐鑫 SoC 融合指南

当前&#xff0c;我们正见证着一场技术革命&#xff0c;而 OpenAI 正处于这场变革的最前沿。其中最激动人心的创新之一就是ChatGPT&#xff0c;它运用自然语言处理的力量&#xff0c;打造出更加引人入胜、直观的用户体验。而将 OpenAI 的 API 与物联网设备相结合&#xff0c;更…

Redis集群部署

Redis集群部署 1.单机安装Redis2.Redis主从集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.开启主从关系2.5.测试 3.搭建哨兵集群3.1.集群结构3.2.准备实例和配置3.3.启动3.4.测试 4.搭建分片集群4.1.集群结构4.2.准备实例和配置4.3.启动4.4.创建集群4.5.测试4.5.测试 本章是基…

java SSM 摄影作品网站myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 摄影作品网站系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

计算机网络-网络体系结构

目录 计算机网络的基本概念计算机网络的定义组成与功能计算机网络的分类按照网络的作用范围进行分类按照网络的使用者进行分类 计算机网络主要性能指标 计算机网络体系结构计算机网络协议、接口、服务等概念ISO/OSI 参考模型和 TCP/IP 模型OSI七层模型TCP/IP 模型封装与分用 计…

攻防渗透第四章(谷歌语法)

一、常用谷歌黑客语法 制定网站的URL site: 包含特定字符的URL inurl: 网页标题中包含特定字符 intitle: 正文中指定字符 intext: 指定类型文件 filetype 开发语言判断 site:163.com filetype:php site:163.com filetype:jsp site:163.com filetype:asp site:163.com filetype…

【裸机开发】内核时钟 PLL1 配置实验(一)—— 寄存器分析篇

本章主要会回答以下问题 &#xff1f; imx6u 的时钟源来自于哪 &#xff1f;为什么一个起始时钟源&#xff0c;最终分成了多路&#xff1f;不同的时钟源是如何与外设对应起来的&#xff1f;&#xff08;时钟树&#xff09;要配置内核时钟频率 有哪些步骤 &#xff1f;涉及到哪…

基于Java购物商城系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

今天面了个35k字节跳动出来,真是砂纸擦屁股,给我露了一手...

​2023年春招已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石…

深入篇【C++】string类的常用接口介绍:标准库中的string类 【万字总结】

深入篇【C】string类的常用接口介绍&#xff1a;标准库中的string类 Ⅰ.string类介绍Ⅱ.string类的常用接口①.string类对象的常用构造1.string()2.string(const char*ch)3.string(const string& str)4.string(size_t n,char c)5.string(const string& str,size_t pos,…

第四章 Linux网络编程 4.1 网络结构模式 4.2MAC地址、IP地址、端口

第四章 Linux网络编程 4.1 网络结构模式 C/S结构 简介 服务器 - 客户机&#xff0c;即 Client - Server&#xff08;C/S&#xff09;结构。C/S 结构通常采取两层结构。服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器…

Seata客户端的启动过程 学习记录

Seata客户端的启动过程 1.自动装配4个配置类 将在SpringBoot启动时往容器中添加4个类 1. 自动配置类 SeataAutoConfiguration SeataAutoConfiguration将会往容器中添加两个bean failureHandler 事务处理失败执行器globalTransactionScanner failureHandler failureHandle…

DBA 抓包神器 tshark 测评

想窥探神秘的网络世界的奥秘&#xff0c;tshark 助你一臂之力&#xff01; 作者&#xff1a;赵黎明 爱可生 MySQL DBA 团队成员&#xff0c;熟悉 Oracle、MySQL 等数据库&#xff0c;擅长数据库性能问题诊断、事务与锁问题的分析等&#xff0c;负责处理客户 MySQL 及我司自研 D…

计算机组成原理(六)指令系统

一、指令的基本格式 1.1机器指令的相关概念 指令集(Instruction Set) 某机器所有机器指令的集合 *定长指令集 指令集中的所有指令长度均相同!取指令控制简单*不定长指令集 指令集中的所有指令长度有长、有短 操作码 (1)长度固定 用于指令字长较长的情况RISC 如IBM370操作码8位…

2023 年前端 Web 发展趋势

虽然就个人观点&#xff0c;我觉得 Web 开发在最近几年都没什么进展&#xff08;2016 年至 2021 年&#xff09;&#xff0c;但在刚刚过去的 2022 年中确实又出现了一些新的技术。在本文中&#xff0c;我想跟大家聊聊自己看到的最新 Web 开发的发展趋势。相信这波浪潮会继续激发…