【问题标题】:Combine multiple heatmaps in matplotlib在 matplotlib 中组合多个热图
【发布时间】:2013-07-22 11:15:05
【问题描述】:

我目前面临可视化三维数据的问题。具体来说,我有两个变化的参数,第三维是结果输出,在这种情况下是一个介于零和一(百分比)之间的值。

我想说明几个不同的数据集。在 matplotlib (pcolor) 中使用热图效果很好。

但是,我想直接比较不同的数据集。我对为每个数据集生成一个单独的图并以这种方式表示它不太满意。我想以某种方式将其绘制在一个图中以便能够直接比较它们。

我尝试了 3D 图(散点图和曲面图),效果相当不错,但值是重叠的,而且大多数时候您只能看到一个数据集。 3D 绘图的效果确实不太好。

所以我的主要问题是是否有人知道我如何在一个情节中表示这一点。

问候!

【问题讨论】:

    标签: python 3d matplotlib heatmap


    【解决方案1】:

    虽然这是一个老问题,但我最近做了一些相关的事情:在同一个图中绘制两个热图。我通过将正方形转换为散点图来做到这一点,我将正方形转换为两个三角形。

    我使用自定义标记制作了两个三角形:

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

    综合起来可以给你一些类似的东西:

    【讨论】:

      【解决方案2】:

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

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

      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。

      【讨论】:

      • 感谢您的提示。我喜欢轮廓方法。然而,不知何故,alpha 值似乎并没有那么好。我添加的 alpha 值越低的控制图越多,alpha 值为 1.0 的主要图也会被调低。这应该这样工作吗?
      【解决方案3】:

      我能想到的最好的方法是将一个绘制为高度(例如一个表面),另一个绘制为映射到该表面的热图。 @HYRY 给出的here 的答案是一个随机着色的示例,您需要使用您的数据集之一指定colors 数组

      您还可以考虑它们之间的关系,如果您将一个除以另一个,您是否可以得到一些其他参数来编码正在发生的事情,或者减去它们?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-22
        • 2021-10-23
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2012-12-09
        相关资源
        最近更新 更多