python - 在 matplotlib 中注释热图

我必须在 matplotlib 中绘制三个图(等高线、3d 表面和热图)。三个图对应的网格尺寸为 ([0, 0], [0, 1], and [1, 0:1])

我有几个问题

  1. 热图 (ax3) 的文本注释似乎飞出 ax3,进入 ax1 和 ax2。如何将它们限制在仅 ax3 内?

  2. 假设我不想使用 seaborn,这是注释文本的最快方法吗?

我能得到一些关于如何解决我的问题的提示吗?

下面是执行绘图操作的代码片段

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gspec
from scipy.interpolate import griddata
import pyautogui
from scipy import stats

x = pyautogui.size()
width = x.width
height = x.height

x = np.arange(0, 10, 0.5)
y = np.arange(0, 10, 0.5)
X, Y = np.meshgrid(x, y)
data = 2 * (np.sin(X) + np.sin(3 * Y))

fig = plt.figure()
fig.set_figheight(height / 100)
fig.set_figwidth(width / 100)
fig.set_dpi(100)
gs = gspec.GridSpec(nrows=2, ncols=2)
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[0, 1], projection='3d')
ax3 = plt.subplot(gs[1, 0:1])
ctr = ax1.contourf(X, Y, data, 10, cmap='viridis')
ax1.clabel(ctr, inline=True, fontsize=8)
cbar = plt.colorbar(ctr, ax=ax1)
cbar.set_label('ColorbarLabel', size=15)
surf = ax2.plot_surface(X, Y, data, cmap='jet')
cbar1 = plt.colorbar(surf, ax=ax2)
cbar1.set_label('Colorbar2', size=15)
hmap = ax3.pcolormesh(X, Y, data, cmap='viridis')
cbar2 = plt.colorbar(hmap, ax=ax3)
for y in range(data.shape[0]):
    for x in range(data.shape[1]):
        ax3.text(x, y, '%.1f' % data[y, x], size=3)

回答1

我假设您希望您的热图涵盖这两列。要实现这一点,您必须使用 ax3 = plt.subplot(gs[1, 0:2]):这告诉 matplotlib 使用第 0 列和第 1 列(不包括 2)。

热图 (ax3) 的文本注释似乎飞出 ax3,进入 ax1 和 ax2。如何将它们限制在仅 ax3 内?

那是因为您在 ax3.text 中使用了错误的坐标。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gspec
from scipy.interpolate import griddata
import pyautogui
from scipy import stats

x = pyautogui.size()
width = x.width
height = x.height

x = np.arange(0, 10, 0.5)
y = np.arange(0, 10, 0.5)
X, Y = np.meshgrid(x, y)
data = 2 * (np.sin(X) + np.sin(3 * Y))

fig = plt.figure()
fig.set_figheight(height / 100)
fig.set_figwidth(width / 100)
fig.set_dpi(100)
gs = gspec.GridSpec(nrows=2, ncols=2)
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[0, 1], projection='3d')
ax3 = plt.subplot(gs[1, 0:2])
ctr = ax1.contourf(X, Y, data, 10, cmap='viridis')
ax1.clabel(ctr, inline=True, fontsize=8)
cbar = plt.colorbar(ctr, ax=ax1)
cbar.set_label('ColorbarLabel', size=15)
surf = ax2.plot_surface(X, Y, data, cmap='jet')
cbar1 = plt.colorbar(surf, ax=ax2)
cbar1.set_label('Colorbar2', size=15)
hmap = ax3.pcolormesh(X, Y, data, cmap='viridis')
cbar2 = plt.colorbar(hmap, ax=ax3)
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        ax3.text(x[j], y[i], '%.1f' % data[i, j], size=5)

相似文章

最新文章