2016-09-01 6 views
0

Я хотел бы сделать контурный график с 3-мя разными цветами. До сих пор, мой код выглядит следующим образом:Matplotlib contourf с 3 цветами

import numpy as np 
import matplotlib.pyplot as plt 

xMin = 0 
xMax = 3 
xList = np.linspace(xMin, xMax, 10) 
X1, X2 = np.meshgrid(xList, xList) 
Z = [] 
# do some processing with Z 
# Z now contains 0, 0.5 or 1, e.g. Z = [0, 0, 0, 1, 1, 0.5, 1, 0.5...] 
Z = Z.reshape((len(X1), len(X2))) 
plt.contourf(X1, X2, Z,alpha=0.5) 

Теперь я хотел бы построить каждый контур, где Z = 0, как красный, Z = 0,5, как зеленый и Z = 1, как синий. Я не хочу иметь гладкие переходы между красным/зеленым/синим цветом, а просто переключателем цвета. Я играл с опцией цвета и уровней, но на самом деле это не получилось так, как ожидалось.

Является ли контурный участок правильным путем?

ответ

1

Вы можете управлять цветами контурного участка с опцией цветов, но вы можете использовать imshow, чтобы избежать интерполяции между уровнями. Вы создаете colormap для imshow с дискретными уровнями, используя ListedColormap.

data = 0*np.ones((20,20)) 
data[5:15,5:15] = 0.5 
data[7:12,8:16] = 1 

# contourf plot 
fig = plt.figure() 
ax1 = fig.add_subplot(2,2,1) 
ax1.contourf(data, [0,0.4,0.9], colors = ['r','g','b']) 
ax1.set_aspect('equal') 
ax1.set_title('contourf') 

# imshow plot 
ax2 = fig.add_subplot(2,2,2) 
# define colr map 
cmap = colors.ListedColormap(['r','g','b']) 
bounds = [0, 0.4,0.6, 1.1] 
norm = colors.BoundaryNorm(bounds, cmap.N) 

ax2.imshow(data, interpolation = 'none', cmap=cmap, norm=norm) 
ax2.set_title('imshow') 

enter image description here

+0

Спасибо, что это именно то, что я ищу – user1228633

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