Skip to main content
 首页 » 编程设计

python pyplot : colorbar on contourf and scatter in same plot

2025年05月04日24lori

我有两个不同的数据集。一个是 numpy NxM 矩阵,另一个是 Lx3 pandas 数据帧。我将散点图(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() 

我尝试设置限制,但结果对我来说仍然没有意义。 contourf 似乎仍然没有在颜色栏中表示。

请您参考如下方法:

您需要对两个图使用相同的颜色归一化。这可以通过使用 norm 关键字参数为两个图提供一个 matplotlib.colors.Normalize 实例来实现。

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() 

此处两个图共享相同的配色方案,因此可以使用单个颜色条。