Python 在同一颜色栏上映射两个子图
我无法将两个不同范围为8.53、9.09和9.55、10.83的直方图子图映射到一个色条。但颜色栏是从第一个或第二个子批次使用pcolormesh绘制的,因为它们没有重叠,所以颜色栏不会显示正确的颜色Python 在同一颜色栏上映射两个子图,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我无法将两个不同范围为8.53、9.09和9.55、10.83的直方图子图映射到一个色条。但颜色栏是从第一个或第二个子批次使用pcolormesh绘制的,因为它们没有重叠,所以颜色栏不会显示正确的颜色 #first histogram subplot binx=np.linspace(9.1,11.35,20) biny=np.linspace(-1.45,0.8,20) median=np.random.uniform(9.55,10.83, size=(20,20)) #finding m
#first histogram subplot
binx=np.linspace(9.1,11.35,20)
biny=np.linspace(-1.45,0.8,20)
median=np.random.uniform(9.55,10.83, size=(20,20))
#finding min and max values of median
dim=np.size(median)
median1=np.reshape(median, (dim, ))
median1=median1[median1!=0]
vmin1=np.sort(median1)[0]
vmax1=np.sort(median1)[-1]
hist1=ax1.pcolormesh(binx, biny, median.T, norm=LogNorm(), cmap='viridis')
hist1.set_clim(vmin1,vmax1)
#the second subplot histogram
man_mass=np.linspace(9.1,11.35,16)
man_sfr=np.linspace(-1.45,0.8,16)
man_med=np.array([[0.,0.,0.,0.,0.,0.,0.,8.56,0.,0.,0.,0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.,8.7,8.7,8.65,8.58,8.53,0.,0.,0.,0.,0.,0.],
[0.,0.,8.77,8.76,8.73,8.75,8.76,8.71,8.69,8.64,8.58,8.53,0.,0.,0.,0.],
[0.,8.83,8.82,8.82,8.81,8.79,8.79,8.77,8.78,8.74,8.69,8.66,8.59,0.,0.,0.],
[8.90,8.90,8.90,8.88,8.88,8.87,8.86,8.85,8.83,8.81,8.79,8.72,8.69,8.64,8.63,0.],
[8.98,8.96,8.95,8.94,8.94,8.93,8.93,8.92,8.90,8.88,8.85,8.82,8.77,8.72,8.71,0.],
[9.02,9.01,8.99,8.98,8.98,8.98,8.98,8.97,8.96,8.94,8.92,8.89,8.85,8.82,8.79,0.],
[9.05,9.04,9.03,9.02,9.02,9.02,9.01,9.01,9.01,8.99,8.97,8.96,8.92,8.88,8.86,8.84],
[0.0,9.06,9.05,9.04,9.04,9.03,9.03,9.03,9.03,9.03,9.02,8.99,8.98,8.94,8.90,0.0],
[0.0,9.08,9.07,9.05,9.05,9.05,9.05,9.05,9.05,9.05,9.04,9.04,9.01,9.0,8.97,8.93],
[0.0,9.09,9.07,9.06,9.06,9.06,9.06,9.06,9.06,9.06,9.06,9.05,9.04,9.03,9.0,8.98],
[0.0,0.0,9.09,9.07,9.06,9.07,9.06,9.06,9.06,9.06,9.07,9.07,9.06,9.05,9.04,9.02],
[0.0,0.0,0.0,9.09,9.08,9.08,9.07,9.07,9.07,9.07,9.07,9.07,9.06,9.07,9.06,9.04],
[0.0,0.0,0.0,0.0,0.0,9.09,9.07,9.07,9.07,9.07,9.07,9.06,9.07,9.07,9.07,0.0],
[0.0,0.0,0.0,0.0,0.0,0.0,9.09,9.08,9.08,9.07,9.07,9.07,9.07,9.08,9.05,0.0],
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,9.06,9.07,9.07,9.06,9.06,0.0,0.0,0.0] ])
#max and min values of second median
dim=np.size(man_med)
man_med1=np.reshape(man_med, (dim, ))
man_med1=man_med1[man_med1!=0]
#print np.partition(median1,1)[1]
vmin2=np.sort(man_med1)[0]
vmax2=np.sort(man_med1)[-1]
hist2=ax2.pcolormesh(man_mass, man_sfr, man_med.T, norm=LogNorm(), cmap='viridis')
hist2.set_clim(vmin1,vmax1)
#pozition and spacing of subplots
plt.subplots_adjust(wspace=0,hspace=0,left=0.2, right=0.85, bottom=0.3)
p0 = ax1.get_position().get_points().flatten()
p1 = ax2.get_position().get_points().flatten()
#colorbar
ax_cbar = fig.add_axes([p0[0], 0.1, p1[2]-p0[0], 0.03])
cbar=plt.colorbar(hist1, cax=ax_cbar, orientation='horizontal')
plt.show()
plt.close()
我希望我的颜色栏显示从最小中值到最大中值的值,从vmin2=8.53到vmax1=10.83,并且直方图显示正确的颜色。代码如下所示:颜色条映射到颜色9.55、10.83的第一个直方图范围,子批次的颜色没有连接,所以第一个子批次的颜色为9.55,第二个子批次的颜色为8.53,最亮的黄色为10.83,第二个子批次的颜色为9.09
请注意:这篇文章应该能回答我的问题,但对我来说不起作用,我不知道为什么。在它中,颜色范围重叠,因此他们可以使用plt.colorbar中的图像。我不能这样做,因为我的范围没有重叠,我只想扩展colorbar以包括这两个范围
请帮忙
编辑:
下面应该是一个解决方案问题的最小示例,即对两个图使用相同的范数
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
x = np.arange(11)
a = np.linspace(1,5,100).reshape((10,10))
b = np.linspace(6,10,100).reshape((10,10))
fig, (ax1, ax2) = plt.subplots(ncols=2)
norm=LogNorm(min(a.min(),b.min()), max(a.max(),b.max()))
p1 = ax1.pcolormesh(x,x,a, norm=norm)
p2 = ax2.pcolormesh(x,x,b, norm=norm)
fig.colorbar(p1, ax=ax1)
fig.colorbar(p2, ax=ax2)
fig.tight_layout()
plt.show()
请提供一份DFF样本,请提供一份。@ImportanceOfBeingErnest您能详细说明我应该在这里发布什么样的数据吗?我提供了数据样本。我还需要附加一些完整数据的文件。我在这里使用直方图,因此需要大量模拟数据才能使代码正常工作。如果您能告诉我如何将原始数据附加到我的问题中,我将很高兴向您发送原始数据。我认为问题并不特定于您的实际数据。因此,您可以提供生成一些数据并以最小且可运行的方式显示问题的代码。@importantanceofbeingernest好的,我为我的第一个子地块制作了模拟中值矩阵。谢谢,这将在两个子地块上一致地映射颜色。但是我只需要一个颜色条,它可以跨越8.53到10.83的两个颜色范围。我可以用cbar.set_clim8.53,10.83指定颜色范围,但我的颜色栏仍然显示9.55到10.83的范围。奇怪的是,无论我写的是:cbar=plt.colorbarhist1,cax=ax\u cbar,orientation='horizontal'还是cbar=plt.colorbarhist2,cax=ax\u cbar,orientation='horizontal',它都显示了相同的结果。我也不知道为什么。对不起,我不知道8.53、9.55和10.83是从哪里来的。也许你想交换p1和p2在使用的标准方面的角色?这些数字来自我的计算。但在代码中我需要的是:如果第一个子批次的颜色范围是0,4而不是0,10,第二个子批次的颜色范围是5,10而不是5,7,并且您希望将它们映射到同一个颜色栏上。我需要一个颜色栏来显示两种颜色范围-在你的问题中,从0,10,第一个子图映射到颜色栏的前半部分,从深蓝色到蓝绿色,第二个子图映射到颜色栏的后半部分,从绿色到亮黄色。我明白了。在对数范数中使用0有点困难,这在原则上需要产生无限的色条。我们可以用不同的方式定义范围吗,或者0是数据的一部分吗?哦,不,我们可以做任何事情,只要范围不重叠。