python pyplot: цветная полоса на контуре и разброс на том же участке

У меня два разных набора данных. Один - это матрица numpy NxM, а другой - фрейм данных Pandas Lx3. Я накладываю график рассеяния (фрейм данных Lx3) поверх контурного графика (NxM), а шкала цветов масштабируется на основе данных графика рассеяния. Как заставить шкалу палитры масштабироваться на основе обоих наборов данных (как синхронизировать шкалу палитры на обоих слоях графика)?

import numpy as np
import matplotlib.pyplot as plt

#generate random matrix with min value of 1 and max value 5
xx = np.random.choice(a = [1,2,3,4,5],p = [1/5.]*5,size=(100,100))

#contourf plot of the xx matrix
plt.contourf(np.arange(100),np.arange(100),xx)

#generate x and y axis of the new dataframe
dfxy = np.random.choice(range(20,80),p = [1/float(len(range(20,80)))]*len(range(20,80)),size = (100,2))

#generate z values of the dataframe with min value 10 and max value 15
dfz = np.random.choice(a = np.linspace(10,15,10),p = [1/10.]*10,size = 100)
plt.scatter(dfxy[:,0],dfxy[:,1],c=dfz,s=80)
cb = plt.colorbar()
#cb.set_clim([1,15])
plt.show()

Я пытаюсь установить пределы, но результаты все еще не имеют для меня смысла. Контур все еще не отображается на палитре цветов. введите описание изображения здесь


person kthouz    schedule 14.02.2017    source источник


Ответы (1)


Вам необходимо использовать одинаковую цветовую нормализацию для обоих графиков. Это может быть выполнено путем предоставления экземпляра matplotlib.colors.Normalize для обоих графиков с использованием аргумента ключевого слова norm.

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

#generate random matrix with min value of 1 and max value 5
xx = np.random.choice(a = [1,2,3,4,5],p = [1/5.]*5,size=(100,100))
#generate x and y axis of the new dataframe
dfxy = np.random.choice(range(20,80),p = [1/float(len(range(20,80)))]*len(range(20,80)),size = (100,2))
#generate z values of the dataframe with min value 10 and max value 15
dfz = np.random.choice(a = np.linspace(0,7,10),size = 100)


mi = np.min((dfz.min(), xx.min()))
ma = np.max((dfz.max(), xx.max()))
norm = matplotlib.colors.Normalize(vmin=mi,vmax=ma)
plt.contourf(np.arange(100),np.arange(100),xx, norm=norm, cmap ="jet")
plt.scatter(dfxy[:,0],dfxy[:,1],c=dfz,s=80, norm=norm, cmap ="jet", edgecolor="k")
cb = plt.colorbar()

plt.show()

Здесь оба графика используют одну и ту же цветовую схему, поэтому можно использовать одну цветовую шкалу.

person ImportanceOfBeingErnest    schedule 14.02.2017