2016-06-25 5 views
1

У меня проблемы с настройкой цвета np.nan значений в моем наборе данных. Мне уже удалось получить camp.set_bad, работающий в imshow участках, но он не работает в plt.scatter.Matplotllib: установить «плохой» цвет в диаграмме рассеяния

В любом случае, моя главная цель - присвоить определенный цвет плохим значениям.

Это, как я, хотя это будет работать (но это не ;-)

import matplotlib.pyplot as plt 
import numpy as np 

n = 20 
x = y = np.linspace(1, 10, n) 
c = np.random.random_sample((n,)) 
c[4] = np.nan 
c[8:12] = np.nan 

cmap = plt.get_cmap('plasma') 
cmap.set_bad(color='black', alpha = 1.) 
plt.scatter(x, y, c=c, s=200, cmap=cmap) 

Это дает мне следующий вывод:

Scatter plot with "bad" values

Конечно, я мог бы разделить набор данных на два отдельных набора и перенаправить их, но я уверен, что существует гораздо более чистое решение.

+0

Просто догадаться, но документы для 'plt.scatter' говорят, что« cmap используется только в том случае, если c является массивом поплавков ", тогда как аналогичное утверждение не сделано о' plt.imshow' – lanery

ответ

1

Нет черного цвета в cmap plasma.

Array c должен хранить указатели цветов, которые вы выбрали из текущей цветовой карты cmap. Если ваш набор c как NaN это означает, что вы не получите объект для этих индексов (4 и 8:12) на участке разброса.

Первый вариант, чтобы установить цвет для выбранных индексов вручную:

import matplotlib.pyplot as plt 
import numpy as np 
n = 20 
x = y = np.linspace(1, 10, n) 
c = np.random.random_sample((n,)) 
#c[4] = np.nan 
#c[8:12] = np.nan 
c[4]=c[8:12]=0 # first color use to mark 4 and 8:12 elements 
cmap = plt.get_cmap('plasma') 
plt.scatter(x, y, s=200, c=c, cmap=cmap) 
plt.show() 

enter image description here

Второй вариант сделать два разброса-участков:

import matplotlib.pyplot as plt 
import numpy as np 

n = 20 
x = y = np.linspace(1, 10, n) 
c = np.random.random_sample((n,)) 
c[4] = np.nan 
c[8:12] = np.nan 
cmap = plt.get_cmap('plasma') 

# plot good values 
indices = ~np.isnan(c) 
plt.scatter(x[indices], y[indices], s=200, c=c[indices], cmap=cmap) 
# plot bad values 
plt.scatter(x[~indices], y[~indices], s=200, c='k') 

plt.show() 

enter image description here

+0

Хорошо, второй подход на самом деле является тем, что я делаю в настоящее время. Так что еще проще. В любом случае спасибо! – tamasgal

+0

Это невозможно, потому что карта цвета плазмы не включает черный цвет, а 'c' должен хранить номер цвета с цветовой карты. – Serenity

Смежные вопросы