修正图 scaling/visibility
Fixing graph scaling/visibility
我主修化学,所以我对 python 还很陌生,但我正在编写一些代码,理想情况下会生成一组值内氢原子能级的图。从技术上讲,我已经成功了(见下图)。正如您所看到的,靠近顶部的线上的比例非常接近,这是有道理的,因为这些值只是非常轻微的不同(在 10^-20 的范围内)并且第一个数字在 10^ 的范围内-18。我想知道是否有人有任何建议可以使这些线条更容易彼此区分?我看到有人谈论放大到特定区域并在单独的框中放大它,但我一直在努力将其实现到我自己的代码中。
import numpy
import math
import os
import matplotlib.pyplot as plt
import pandas as pd
n_max = 10 #This is the highest energy level you want to look at (ie: for energy levels 1-10 "n" would be 10)
m_e = 9.1093837015* 10 ** -31 # kg
e = 1.602176634* 10 ** -19 # C
vp = 1.113* 10 ** -10 # C^2 / Jm
h = 6.62607015 * 10 ** -34 # J*s
h_bar = h/(2 * math.pi)
n = numpy.linspace(1, n_max, n_max)
p1 = m_e * e **4
p2 = 2 * vp ** 2
p3 = h_bar ** 2
p4 = n ** 2
p5 = p2*p3*p4
e_lv = - p1/p5
for inte in e_lv:
x = range(0,n_max)
y = [inte]*n_max
plt.plot(x, y)
plt.xticks([])
到目前为止我的代码是这样的。
一个技巧可能是使用 mathematical transformation,尽管这是非常特定于领域的,因此您应该检查化学文献中通常使用哪种数学变换来表示这种类型的图。
建议的转换可以是:
其中 E
是你在 J 中计算的能级,而 E'
代表 的指数的绝对值能量水平,因此它在18-20的范围内。
由于此数学变换着重于能级的指数,因此其值不再以J.
来衡量
如果您将此概念应用到您的代码中:
import numpy
import math
import matplotlib.pyplot as plt
n_max = 10 #This is the highest energy level you want to look at (ie: for energy levels 1-10 "n" would be 10)
m_e = 9.1093837015* 10 ** -31 # kg
e = 1.602176634* 10 ** -19 # C
vp = 1.113* 10 ** -10 # C^2 / Jm
h = 6.62607015 * 10 ** -34 # J*s
h_bar = h/(2 * math.pi)
n = numpy.linspace(1, n_max, n_max)
p1 = m_e * e **4
p2 = 2 * vp ** 2
p3 = h_bar ** 2
p4 = n ** 2
p5 = p2*p3*p4
e_lv = - p1/p5
fig, ax = plt.subplots(1, 2)
for inte in e_lv:
x = range(0,n_max)
y = [inte]*n_max
ax[0].plot(x, y)
ax[0].set_xticks([])
ax[0].set_ylabel('Energy level')
ax[1].plot(x, -numpy.log10(numpy.abs(y)))
ax[1].set_xticks([])
ax[1].set_ylabel('Absolute value of exponent of energy level')
plt.tight_layout()
plt.show()
我主修化学,所以我对 python 还很陌生,但我正在编写一些代码,理想情况下会生成一组值内氢原子能级的图。从技术上讲,我已经成功了(见下图)。正如您所看到的,靠近顶部的线上的比例非常接近,这是有道理的,因为这些值只是非常轻微的不同(在 10^-20 的范围内)并且第一个数字在 10^ 的范围内-18。我想知道是否有人有任何建议可以使这些线条更容易彼此区分?我看到有人谈论放大到特定区域并在单独的框中放大它,但我一直在努力将其实现到我自己的代码中。
import numpy
import math
import os
import matplotlib.pyplot as plt
import pandas as pd
n_max = 10 #This is the highest energy level you want to look at (ie: for energy levels 1-10 "n" would be 10)
m_e = 9.1093837015* 10 ** -31 # kg
e = 1.602176634* 10 ** -19 # C
vp = 1.113* 10 ** -10 # C^2 / Jm
h = 6.62607015 * 10 ** -34 # J*s
h_bar = h/(2 * math.pi)
n = numpy.linspace(1, n_max, n_max)
p1 = m_e * e **4
p2 = 2 * vp ** 2
p3 = h_bar ** 2
p4 = n ** 2
p5 = p2*p3*p4
e_lv = - p1/p5
for inte in e_lv:
x = range(0,n_max)
y = [inte]*n_max
plt.plot(x, y)
plt.xticks([])
到目前为止我的代码是这样的。
一个技巧可能是使用 mathematical transformation,尽管这是非常特定于领域的,因此您应该检查化学文献中通常使用哪种数学变换来表示这种类型的图。
建议的转换可以是:
其中 E
是你在 J 中计算的能级,而 E'
代表 的指数的绝对值能量水平,因此它在18-20的范围内。
由于此数学变换着重于能级的指数,因此其值不再以J.
来衡量
如果您将此概念应用到您的代码中:
import numpy
import math
import matplotlib.pyplot as plt
n_max = 10 #This is the highest energy level you want to look at (ie: for energy levels 1-10 "n" would be 10)
m_e = 9.1093837015* 10 ** -31 # kg
e = 1.602176634* 10 ** -19 # C
vp = 1.113* 10 ** -10 # C^2 / Jm
h = 6.62607015 * 10 ** -34 # J*s
h_bar = h/(2 * math.pi)
n = numpy.linspace(1, n_max, n_max)
p1 = m_e * e **4
p2 = 2 * vp ** 2
p3 = h_bar ** 2
p4 = n ** 2
p5 = p2*p3*p4
e_lv = - p1/p5
fig, ax = plt.subplots(1, 2)
for inte in e_lv:
x = range(0,n_max)
y = [inte]*n_max
ax[0].plot(x, y)
ax[0].set_xticks([])
ax[0].set_ylabel('Energy level')
ax[1].plot(x, -numpy.log10(numpy.abs(y)))
ax[1].set_xticks([])
ax[1].set_ylabel('Absolute value of exponent of energy level')
plt.tight_layout()
plt.show()