matplotlib - раскраска по значениям массива - PullRequest
0 голосов
/ 14 февраля 2020

Я изо всех сил пытаюсь построить рассеянные точки, которые окрашены значением из списка (для простоты здесь цвет должен быть значением 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

new test_data:

&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-l oop, при назначении цвета, но я не понимаю, почему / где ...

resulting plot

РЕДАКТИРОВАТЬ: Это была довольно глупая ошибка, цветовая шкала не была правильно организована во время циклического прохождения данных. Установка экстремальных пределов решила проблему:

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

new resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...