matplotlib 合并多个热图

shstlldc  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(148)

我目前正面临着三维数据可视化的问题。具体地说,我有两个变化的参数,第三个维度是结果输出,在本例中是0和1之间的值(百分比)。
我有几个不同的数据集,我想说明。在matplotlib(pcolor)中使用热图效果很好。
但是,我想直接比较不同的数据集。我不太喜欢为每个数据集生成一个单独的图并以这种方式表示它。我不知何故想把它画在一个图中,以便能够直接比较它们。
我试过3D图(散点图和曲面图),效果相当不错,但值是重叠的,大多数时候你只能看到一个数据集。3D打印真的不太好用。
所以我的主要问题是,如果有人有一个想法,我怎么能代表这在一个情节。
问候!

hsvhsicv

hsvhsicv1#

虽然这是个老问题,但我最近做了一些相关的事情:在同一图中绘制两个热图。我把正方形转换成散点图,把正方形转换成两个三角形。
我使用自定义标记制作了两个三角形:

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

 def getCustomSymbol1(path_index=1):
  if path_index==1:  #upper triangle
      verts = [
      (0.0,0.0),
      (1.0,0.0),
      (1.0,1.0),
      (0.0,0.0),]
  else:              #lower triangle
      verts = [
      (0.0,0.0),
      (0.0,1.0),
      (1.0,1.0),
      (0.0,0.0),]
  codes = [matplotlib.path.Path.MOVETO,
           matplotlib.path.Path.LINETO,
           matplotlib.path.Path.LINETO,
           matplotlib.path.Path.CLOSEPOLY,
           ] 
  pathCS1 = matplotlib.path.Path(verts, codes)
  return pathCS1, verts

 def plot_mat(matrix=np.random.rand(20,20), path_index=1, alpha=1.0, vmin=0., vmax=1.):
    nx,ny = matrix.shape
    X,Y,values = zip(*[ (i,j,matrix[i,j]) for i in range(nx) for j in range(ny) ] )
    marker,verts = getCustomSymbol1(path_index=path_index)
    ax.scatter(X,Y,s=4000, 
               marker=marker, 
               c=values, 
               cmap='viridis', 
               alpha=alpha, 
               vmin=vmin, vmax=vmax )
    return

 fig = plt.figure()
 ax = fig.add_subplot(111)
 A  = np.random.uniform(20,50,30).reshape([6,5])
 B  = np.random.uniform(40,70,30).reshape([6,5])
 vmin = np.min([A,B])
 vmax = np.max([A,B])
 plot_mat(path_index=1,vmin=vmin,vmax=vmax,matrix=A)
 plot_mat(path_index=2,vmin=vmin,vmax=vmax,matrix=B)
 plt.xlim([0,6])
 plt.ylim([0,5])
 # for the colorbar i did the trick to make first a fake mappable:
 sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=vmin, vmax=vmax ) )
 sm._A=[]
 plt.colorbar(sm)
 plt.show()

它们加在一起可以给予你这样的东西:

6mzjoqzu

6mzjoqzu2#

有几个选项可以同时呈现两个数据集:

选项1-绘制两个数据集差异的热图(或比率,任何在您的情况下更合适的)

pcolor(D2-D1)

然后给出这些比较图中的几个。

选项2-将1个数据集表示为pcolor,另一个数据集表示为countour:

pcolor(D1)
contour(D2)

如果你真的需要同时显示N〉2个数据集,我会使用contour或contourf:

contourf(D1,cmap='Blues')
contourf(D2,cmap='Reds', alpha=0.66)
contourf(D2,cmap='Reds', alpha=0.33)

contour(D1,cmap='Blues')
contour(D2,cmap='Reds')
contour(D2,cmap='Reds')

不幸的是,类似的alpha技巧不能很好地与pcolor一起工作。

8nuwlpux

8nuwlpux3#

我能想到的最好的方法是把一个画成高度(e)。例如表面),另一个作为Map到该表面上的热图。@HYRY给出的here的答案是一个随机着色的示例,您需要使用其中一个数据集指定colors数组
你也可以考虑它们是如何联系的,如果你把它们除以另一个,你能得到其他的参数来编码正在发生的事情,或者减去它们?

相关问题