首页 > 解决方案 > matplotlib - 按数组的值着色

问题描述

我正在努力绘制由列表中的值着色的散点(为简单起见,这里的颜色应为 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()

新结果图

标签: pythonmatplotlibplot

解决方案


推荐阅读