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

news2024/11/17 17:33:09

第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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL高级篇笔记-MySQL事务日志(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、redo日志 1、为什么需要REDO日志 2、REDO日志的好处、特点 3、redo的组成 4、redo的整体流程 5、redo log的刷盘策略 6、不同刷盘策略演示 流程图 7、写入redo log buffer 过程 1.补充概念&#xff1a;Mini-Transaction…

Linux防火墙学习笔记10

iptables的拓展匹配&#xff1a; icmp模块的使用方法&#xff1a; iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT 说明&#xff1a;回应 我能ping通别人&#xff0c;别人ping不通我。 iprange模块的作用&#xff1a; iptables -t filter…

常见网络协议汇总

常见的网络协议有:TCP/IP协议、UDP协议、HTTP协议、FTP协议等&#xff0c;本文就详细的介绍一下常见的网络协议&#xff0c;通过这些具体的协议更深刻的认识整体网络的传输流程及相关网络原理&#xff0c;感兴趣的可以了解一下。 前言 本篇博客将对基于 计算机网络五层模型 中…

bff服务编排

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

工具应用问题处理

目录 eclipseIdea eclipse 更改eclipse字体&#xff1a; window - Preferences - General --> Appearance --> Colors and Fonts - Java–>Java Editors Text Font(set to default:Text Font) 在弹出的窗口选择要更改的字体样式 点击确定&#xff0c;最后apply即可 …

Java企业级信息系统开发学习笔记(4.3) Spring Boot两种全局配置和两种注解

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/Z2viP】 文章目录 一、Application.properites配置文件1.1 创建Spring Boot的Web项目ProperitesDemo1.2 在应用属性文件里添加相关配置1. 配置服务器端口号和web虚拟路径2. 对象类型的配置与使用&…

seata启动报错

目录 一、说是druid连接失败的问题 二、有可能也是因为内存不足&#xff0c; 我遇到的问题如下&#xff1a; INFO --- [ctionPool-Create-18213909] com.alibaba.druid.pool.DruidDataSource : put physical connection to pool failed. 一、说是druid连接失败的问题 厚礼…

做项目的时候大量需求测不过来怎么破?

互联网测试少&#xff0c;测试研发比大概在1:5&#xff0c;再加上产品再使足了劲上需求&#xff0c;导致了测试需求量大&#xff0c;测试准备时间短&#xff0c;从而降低了上线质量。那么如何解决呢&#xff1f;测试是质量负责人&#xff0c;要对平台质量负责&#xff0c;于是就…

Cesium 实战 - 气泡框跟随飞行

Cesium 实战 - 气泡框跟随飞行 Cesium 气泡框跟随气泡框在线示例 气泡框在地图中非常常用&#xff0c;尤其是二维地图中&#xff1b;而在三维地图中经常会用广告牌、标牌等作为气泡框使用。 广告牌&#xff08;billboard&#xff09;虽然方便&#xff0c;但是不支持富文本&…

Mysql数据库基础和增删改查操作(每一次「欢喜」都值得纪念)

文章目录 一、数据库基本概念数据表数据库数据库管理系统(DBMS)数据库系统 二、数据库类型和常用数据库1.关系型数据库2.非关系型数据库 三、数据库的数据类型四、SQL语句1.简介2.分类 五、SQL语句的使用1.数据库操作&#xff08;1&#xff09;创建数据库 2.数据库表操作&#…

【笔试强训选择题】Day24.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

窥探系列之数字证书

资料 华为数字证书解读 彻底搞懂HTTPS的加密原理 解读 使用过程 首先&#xff0c;证书持有者拥有一对公私钥&#xff1b;CA机构验证证书申请人身份后&#xff0c;使用CA机构私钥(属于根证书&#xff0c;一般浏览器保有CA的根证书公钥&#xff09;对申请人的基本信息及公钥进…

如何管理与改进低质供应商?帮助供应商提升自身质量能力?

管理和改进低质量的供应商可能是一项具有挑战性的任务&#xff0c;但与他们合作以提高他们的能力是可能的。可以采取一些步骤来管理和帮助提高供应商的质量&#xff1a; 确定根本原因&#xff1a;了解供应商产品或服务质量低下的原因。对他们的流程、资源和能力进行全面评估&am…

测试不到3年,来面试开口要25K,面完连10K都不想给

前言 我的好朋友兼大学同学老左家庭经济情况不错&#xff0c;毕业之后没两年自己存了点钱加上家里的支持&#xff0c;自己在杭州开了一家网络公司。由于公司不是很大所以公司大部分的测试人员都是自己面试的&#xff0c;近期公司发展的不错&#xff0c;打算扩招也面试了不少人…

聊一聊近期测试行情以及个人的感受

众所周知&#xff0c;去年年底的裁员潮再加上今年的疫情影响&#xff0c;失业、找工作成为了蛮多人的当务之急。最近一些招聘网站也出现被刷爆的情况&#xff0c;其中顺利找到工作的并不多&#xff0c;说明行情很冷&#xff0c;但是总有许多人顺利跳槽。 其实对于大牛来说&…

【深度学习】日常笔记4

softmax(o)给出的分布⽅差&#xff0c;并与softmax交叉熵损失l(y, yˆ)的⼆阶导数匹配。 Softmax函数可以将一组任意实数值转换为一个概率分布&#xff0c;它的输出值是各个类别的概率估计。如果我们用softmax函数得到的概率分布与真实分布非常相似&#xff0c;那么交叉熵损失…

Vue 项目使用 ECharts 使用路由或者点击浏览器前进/后退切换页面回来图表不显示

问题描述 问题1&#xff1a; 解决方案对应方案1 在 Vue 项目中使用 ECharts 时&#xff0c;一开始图表能渲染出来&#xff0c;当切换到其他页面再回来的时候&#xff0c;图表就不显示了 问题2&#xff1a; 解决方案对应方案2 Echarts 图表在子组件中&#xff0c;父组件通过传递…

【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十…

【多线程进阶】JUC下的常用类

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 ReentrantLock Semaphore(信号量) 计数器——…

阿里发布Java岗春招面试总结(复盘版)GitHub一经上传火爆全网!

Java面试都只是背答案吗? Java 八股文面试当然要背&#xff0c;不背就通过不了面试。 因为经济环境的问题&#xff0c;互联网行业竞争越来越严峻&#xff0c;面试也是越来越难。需要我们掌握的技术也是越来越多、要求是越来越高。作为一个资深的互联网码农&#xff0c;今天给…