我正在努力绘制由列表中的值着色的散点(为简单起见,这里的颜色应为 y 值)。我以某种方式成功了,但似乎只有最后一次读取的值被识别为着色。我现在的代码
import numpy as np
import re
import matplotlib.pyplot as plt
with open("test_a") as fobj:
first_line = fobj.readline()
nbnd = re.findall('\d+', first_line )[0]
nks = re.findall('\d+', first_line )[1]
nbnd = int(nbnd)
nks = int(nks)
all_values = iter(x for x in fobj.read().split())
ek = []
kpt = []
for x in range(nks):
kpt.append([float(next(all_values)) for counter in range(3)])
ek.append([float(next(all_values)) for counter in range(nbnd)])
X = []
Y = []
for j in range(len(kpt)):
X.append(kpt[j][0]+kpt[j][1]+kpt[j][2])
Y = np.array(ek)
for i in range(len(ek[0])):
p1 = plt.scatter(X, [pt[i] for pt in Y], c = [pt[i] for pt in Y] , s = 100, marker = "o", edgecolors= "none")
plt.colorbar(p1)
plt.show()
和一个简单的test_data:
&pl nd= 6, ns= 4 /
-0.500000 -0.288675 0.000000
-5 -5 -5.1 -5.23 -5.4 -5.4
-0.500000 -0.288675 0.100000
-4 -4 -6.1 -6 -5.4 -6
-0.500000 -0.288675 0.200000
-2 -2.1 -1.9 -1.8 -1.7 -2.0
-0.500000 -0.288675 0.300000
-1.1 1.2 1.5 1.55 1.2 2.0
新的测试数据:
&pl nd= 6, ns= 4 /
-0.500000 -0.288675 0.000000
-5 -5 -5.1 -5.23 -5.4 -9.4
-0.500000 -0.288675 0.100000
-4 -4 -6.1 -6 -5.4 -8
-0.500000 -0.288675 0.200000
-2 -2.1 -1.9 -1.8 -1.7 -2.0
-0.500000 -0.288675 0.300000
-2.1 1.2 1.5 1.55 1.2 2.0
我很确定我在分配颜色时弄乱了for循环,但我看不出为什么/在哪里......
编辑:这是一个相当愚蠢的错误,颜色条在循环数据时没有正确排列。设置极值限制解决了这个问题:
import numpy as np
import re
import matplotlib.pyplot as plt
with open("test_a") as fobj:
first_line = fobj.readline()
nbnd = re.findall('\d+', first_line )[0]
nks = re.findall('\d+', first_line )[1]
nbnd = int(nbnd)
nks = int(nks)
all_values = iter(x for x in fobj.read().split())
ek = []
kpt = []
for x in range(nks):
kpt.append([float(next(all_values)) for counter in range(3)])
ek.append([float(next(all_values)) for counter in range(nbnd)])
X = []
Y = []
for j in range(len(kpt)):
X.append(kpt[j][0]+kpt[j][1]+kpt[j][2])
Y = np.array(ek)
#find extrema
vmin = np.amin(Y)
vmax = np.amax(Y)
for i in range(len(ek[0])):
p1 = plt.scatter(X, [pt[i] for pt in Y], c = [pt[i] for pt in Y] , s = 100, marker = "o", edgecolors= "none", vmin=vmin, vmax=vmax)
plt.colorbar(p1)
plt.show()