【问题标题】:Plotting a 2D heatmap with Matplotlib使用 Matplotlib 绘制 2D 热图
【发布时间】:2016-01-21 19:28:05
【问题描述】:

使用 Matplotlib,我想绘制 2D 热图。我的数据是一个 n×n Numpy 数组,每个数组的值都在 0 和 1 之间。所以对于这个数组的 (i, j) 元素,我想在我的 (i, j) 坐标处绘制一个正方形热图,其颜色与数组中元素的值成正比。

我该怎么做?

【问题讨论】:

标签: python numpy matplotlib


【解决方案1】:

带有参数interpolation='nearest'cmap='hot'imshow() 函数应该可以满足您的需求。

import matplotlib.pyplot as plt
import numpy as np

a = np.random.random((16, 16))
plt.imshow(a, cmap='hot', interpolation='nearest')
plt.show()

【讨论】:

  • 我认为没有必要指定插值。
  • @miguel.martin 根据 pyplot 的文档:“如果插值是无(其默认值),则默认为 rc image.interpolation”。所以我认为有必要将其包括在内。
  • @P.Camilleri 如何缩放 X 和 Y 轴? (只改变数字,没有缩放)。
  • 链接断开,new link
【解决方案2】:

Seaborn 处理了大量的手动工作,并自动在图表的一侧绘制渐变等。

import numpy as np
import seaborn as sns
import matplotlib.pylab as plt

uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, linewidth=0.5)
plt.show()

或者,您甚至可以绘制正方形矩阵的上/左下/右三角形,例如一个正方形且对称的相关矩阵,因此绘制所有值无论如何都是多余的。

corr = np.corrcoef(np.random.randn(10, 200))
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
    ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True,  cmap="YlGnBu")
    plt.show()

【讨论】:

  • 我很喜欢情节类型,半矩阵很好用。两个问题:1)在第一个情节中,小方块被白线隔开,它们可以连接吗? 2)白线宽度似乎有所不同,这是人工制品吗?
  • 您可以将我在第一个图中使用的“线宽”参数用于任何其他图(例如在第二个图中),以获得间隔的正方形。由于屏幕截图问题,线宽仅在第一个图中出现变化,实际上它们并没有变化,它们应该保持在您设置的常数。
  • 虽然这是真的 - 我不认为使用 seaborn 的响应应该被认为是完整的一个问题,具体说明 matplotlib。
【解决方案3】:

我会使用 matplotlib 的 pcolor/pcolormesh 函数,因为它允许数据的非均匀间距。

示例取自matplotlib:

import matplotlib.pyplot as plt
import numpy as np

# generate 2 2d grids for the x & y bounds
y, x = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))

z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
# x and y are bounds, so z should be the value *inside* those bounds.
# Therefore, remove the last value from the z array.
z = z[:-1, :-1]
z_min, z_max = -np.abs(z).max(), np.abs(z).max()

fig, ax = plt.subplots()

c = ax.pcolormesh(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max)
ax.set_title('pcolormesh')
# set the limits of the plot to the limits of the data
ax.axis([x.min(), x.max(), y.min(), y.max()])
fig.colorbar(c, ax=ax)

plt.show()

【讨论】:

    【解决方案4】:

    对于二维 numpy 数组,只需使用 imshow() 可能会对您有所帮助:

    import matplotlib.pyplot as plt
    import numpy as np
    
    
    def heatmap2d(arr: np.ndarray):
        plt.imshow(arr, cmap='viridis')
        plt.colorbar()
        plt.show()
    
    
    test_array = np.arange(100 * 100).reshape(100, 100)
    heatmap2d(test_array)
    

    此代码生成一个连续的热图。

    您可以从here 中选择另一个内置的colormap

    【讨论】:

      【解决方案5】:

      这是从 csv 执行此操作的方法:

      import numpy as np
      import matplotlib.pyplot as plt
      from scipy.interpolate import griddata
      
      # Load data from CSV
      dat = np.genfromtxt('dat.xyz', delimiter=' ',skip_header=0)
      X_dat = dat[:,0]
      Y_dat = dat[:,1]
      Z_dat = dat[:,2]
      
      # Convert from pandas dataframes to numpy arrays
      X, Y, Z, = np.array([]), np.array([]), np.array([])
      for i in range(len(X_dat)):
              X = np.append(X, X_dat[i])
              Y = np.append(Y, Y_dat[i])
              Z = np.append(Z, Z_dat[i])
      
      # create x-y points to be used in heatmap
      xi = np.linspace(X.min(), X.max(), 1000)
      yi = np.linspace(Y.min(), Y.max(), 1000)
      
      # Interpolate for plotting
      zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic')
      
      # I control the range of my colorbar by removing data 
      # outside of my range of interest
      zmin = 3
      zmax = 12
      zi[(zi<zmin) | (zi>zmax)] = None
      
      # Create the contour plot
      CS = plt.contourf(xi, yi, zi, 15, cmap=plt.cm.rainbow,
                        vmax=zmax, vmin=zmin)
      plt.colorbar()  
      plt.show()
      

      dat.xyz 在表单中的位置

      x1 y1 z1
      x2 y2 z2
      ...
      

      【讨论】:

      • 请注意:我不得不将方法从三次更改为最接近或线性,因为三次导致很多 NaN,因为我使用的是 0..1 之间的相当小的值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2020-03-31
      • 2019-10-21
      • 1970-01-01
      • 2017-04-23
      • 2020-06-20
      • 2016-06-06
      相关资源
      最近更新 更多