Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在同一颜色栏上映射两个子图_Python_Matplotlib_Colorbar - Fatal编程技术网

Python 在同一颜色栏上映射两个子图

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

我无法将两个不同范围为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 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是数据的一部分吗?哦,不,我们可以做任何事情,只要范围不重叠。