Python +向2D直方图中添加等高线

时间:2018-07-18 08:32:55

标签: python matplotlib contour histogram2d

我有一个代码(见下文)来绘制密度散布图(二维直方图)。

我现在想添加等高线,以代表数据数量的7个选定百分位(5%,10%,25%,50%,75%,90%,95%)。

我使用Google搜索解决方案已有很长时间了,却没有找到真正适合我的问题的解决方案。所以,请问我该怎么做?

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

# Create the fake data
a = np.random.randint(10, size=500)
b = np.random.randint(10, size=500)

# Sort B after A
p = a.argsort()              
A = a[p]     
B = b[p]   

# Set up xedges, yedges and colormap
xedges = np.arange(0.0, 10.0, 1)
yedges = np.arange(0.0, 10.0, 1)
cmap_DeScPl = cm.CMRmap_r
cmap_DeScPl.set_bad(color='white')
bounds_DeScPl =  np.arange(0, 31, 1)
norm_DeScPl = mpl.colors.BoundaryNorm(bounds_DeScPl, cmap_DeScPl.N)

# Plot the 2D Histogram
C, xedges, yedges = np.histogram2d(A, B, bins=(xedges, yedges))
CT = C.T
x, y = np.meshgrid(xedges, yedges)
plt.title('2D Histogram')
plt.pcolor(x, y, CT, cmap=cmap_DeScPl, norm=norm_DeScPl)
plt.subplots_adjust(bottom=0.1, right=0.8, top=0.9)
cax = plt.axes([0.82, 0.1, 0.075, 0.8])
plt.colorbar(cax=cax, label='Number of Data')
plt.show()

# Calculate Percentiles
CT_perc = np.zeros([7])
CT_perc[0] = np.percentile(CT, 5)
CT_perc[1] = np.percentile(CT, 10)
CT_perc[2] = np.percentile(CT, 25)
CT_perc[3] = np.percentile(CT, 50)
CT_perc[4] = np.percentile(CT, 75)
CT_perc[5] = np.percentile(CT, 90)
CT_perc[6] = np.percentile(CT, 95)

#Define a discrete colormap
nb_features = 7
contourlist = [np.array((0.,0.,0.)) for i in np.arange(nb_features)] 
contourlist[0] = np.array((40.,60.,230.))/255      # 5%      (blue)
contourlist[1] = np.array((50.,150.,200.))/255     # 10%     (light blue)
contourlist[2] = np.array((40.,220.,40.))/255      # 25%     (green)
contourlist[3] = np.array((220.,220.,50.))/255     # 50%     (yellow)
contourlist[4] = np.array((240.,30.,30.))/255      # 75%     (red)
contourlist[5] = np.array((180.,70.,30.))/255      # 90%     (brown)
contourlist[6] = np.array((40.,40.,40.))/255       # 95%     (black)
cmap_contour = mpl.colors.ListedColormap(contourlist)
colorbins = [0, CT_perc[0], CT_perc[1], CT_perc[2], CT_perc[3], CT_perc[4], CT_perc[5], CT_perc[6]]
norm_contour = mpl.colors.BoundaryNorm(colorbins, cmap_contour.N)

# Plot Contours of Percentiles
plt.title('Contour Lines of Percentiles')
plt.contour(x[:-1,:-1], y[:-1,:-1], CT, cmap=cmap_contour, norm=norm_contour)
plt.subplots_adjust(bottom=0.1, right=0.8, top=0.9)
cax = plt.axes([0.82, 0.1, 0.075, 0.8])
plt.colorbar(cax=cax, label='Number of Data')
plt.show()

0 个答案:

没有答案