Matplotlib: индексирование цветовой карты - PullRequest
1 голос
/ 06 июня 2019

У меня есть трехмерный график, но 4 из 16 моих точек данных содержат недопустимые данные одного из компонентов (т. Е. Вектор имеет хорошие данные x и y, но плохие данные z). Я мог бы просто опустить точки полностью, но тогда я избавляюсь от хороших данных (в направлениях x и y). В идеале я хотел бы иметь возможность изменить цвет отсутствующих данных в качестве флага, чтобы они все еще отображались, но я могу сказать, какие из них не содержат данных.

У меня очень мало опыта работы с цветными картами, особенно в 3-х. Я пытался адаптировать решения от: (python) график 3d-поверхности с картой цветов в качестве 4-го измерения, функция x, y, z Создание собственной цветовой карты с использованием matplotlib и цветовой шкалы графика и этот, который кажется наиболее полезным: Добавление цветов в трехмерный колчан в matplotlib Но я просто хочу, чтобы все они были одинакового цвета, за исключением очень специфических точек данных, и я не уверен, как индексировать карту цветов.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D

def main():

    data = [[  1.52940323e-06,   3.30263460e-07,   1.23333738e-02],
            [ 0.00062357, -0.00061659, -0.21386033],
            [-0.00028384,  0.00088403, -0.21165629],
            [ 0.00225299,  0.00180132, -0.1964095 ],
            [-0.00066298,  0.00271399, -0.23091235],
            [ 0.00054687, -0.00063866, -0.24299   ],
            [ 0.00170783, -0.00140304, -0.09094558],
            [-0.00378669, -0.00592137, -0.07358853],
            [  5.84581114e-07,  -3.58723162e-07,  -3.08931350e-02],
            [ 0.0003522 , -0.00067592, -0.23933634],
            [ -5.84077540e-07,   2.08945622e-07,  -4.31579608e-02],
            [-0.00196888,  0.00261409, -0.28115362],
            [ -1.65606166e-04,   1.89755530e-01,  -1.49510581e-02],
            [-0.00048166,  0.00095946, -0.26929835],
            [  8.26054997e-04,  -7.75840354e-05,  -3.05118605e-01],
            [ 0.0018271 ,  0.00078126, -0.18526635]]


    fig = plt.figure()
    ax = Axes3D(fig)



    x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    y = [-0.002, -0.002, -0.002, -0.002, -0.001, -0.001, -0.001, -0.001, 
        0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.002, 0.002]
    z = [-0.0022500000000000003, -0.00075, 0.00075, 0.0022500000000000003, 
         -0.0022500000000000003, -0.00075, 0.00075, 0.0022500000000000003, 
         -0.0022500000000000003, -0.00075, 0.00075, 0.0022500000000000003, 
         -0.0022500000000000003, -0.00075, 0.00075, 0.0022500000000000003]


    # data[0]= [0]*3
    # data[8]= [0]*3
    # data[10]= [0]*3
    # data[12]= [0]*3
    u = [data[i][0] for i in range(len(data))]
    v = [data[i][1] for i in range(len(data))]
    w = [data[i][2] for i in range(len(data))]
    cdict = {'green': np.array(len(u)), 'green': np.array(len(u)), 
             'green':np.array(len(u))}
    cdict = {'red': [0],'red': [0],'red': [0]}

    ax.quiver(x,y,z,u,v,w, length=0.001, normalize=True, colors=cdict)

    ax.set_xlabel("X direction")
    ax.set_ylabel("Y direction")
    ax.set_zlabel("Z direction")
    plt.axis('equal')
    plt.show()


if __name__ == '__main__':
    main()

Это отображает все как красный, вместо всего зеленого и только некоторые векторы красного цвета. Я не совсем уверен, что я делаю, и любая помощь будет высоко ценится! (Также да, я застрял в каменном веке с питоном 2)

Edit: Вдохновленный ответом ниже, я создал маску для «плохих» каналов, затем создал два графика: один с хорошими каналами синего цвета, а другой с плохими каналами красного цвета.

dead_chans = [1, 0,0,0,0,0,0,0,1,0,1,0,1,0,0,0]
good_u = np.ma.masked_array(u,dead_chans)
good_v = np.ma.masked_array(v, dead_chans)
good_w = np.ma.masked_array(w, dead_chans)

dead_u = np.ma.masked_array(u, np.logical_not(dead_chans))
dead_v = np.ma.masked_array(v, np.logical_not(dead_chans))
dead_w = np.ma.masked_array(w, np.logical_not(dead_chans))

ax.quiver(x,y,z,good_u,good_v,good_w, length=0.01, normalize=True, color= 
'b')
ax.quiver(x,y,z,dead_u,dead_v,dead_w, length=0.01, normalize=True, color = 
'r')
plt.show()

1 Ответ

0 голосов
/ 06 июня 2019

Вы можете установить значения z на np.nan вместо полного их игнорирования. Тогда вы можете использовать colormap.set_bad(), чтобы изменить цвет ваших значений наночастиц на что-то конкретное.

Надеюсь, что поможет

https://matplotlib.org/api/_as_gen/matplotlib.colors.Colormap.html

Редактировать

с помощью этого поста: Как отобразить значения NaN как специальный цвет с помощью imshow в matplotlib?

Вот пример.

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#Set the defualt cmap for mpl
mpl.rcParams['image.cmap'] = 'Blues'
cmap = mpl.cm.get_cmap()
cmap.set_bad(color='Red')

#Generate some data with np.nan values
x = np.arange(1,13,1)
y = np.arange(1,13,1)
vals = np.zeros([12,12])

for i in range(12):
    for j in range(12):
        if (i+j)%7==0:
            vals[i,j] = np.nan
        else:
            vals[i,j] = i*j

plt.pcolormesh(x,y,arr)

Этот код возвращает следующий график:

plot with nans

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