第1关 能带曲线绘制一
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关 能带曲线绘制二
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关 能带曲线绘制(拓展)
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()
如果此文章对你有所帮助,麻烦点个赞,谢谢~~~
点赞加关注,追新不迷路~~~