刻度与 matplotlib 中的单元格不对齐 table

Ticks not aligned with the cell in matplotlib table

我正在使用 matplotlib table 创建包含不同值的热图。创建 table 时,刻度未在 x 轴和 y 轴上的每个单元格的中心对齐。 我想创建这样的东西。

而是我得到的刻度在两个轴上都不一致。刻度从左下角列的单元格中间开始,并在移动到顶部和右侧单元格时变形。

我正在使用此代码生成此 matplotlip table。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import os
import sys
from matplotlib.table import Table


fig,ax=plt.subplots(figsize=(15,15))
tb = Table(ax,bbox=[0,0,1,1])

nrows, ncols = 20,20
width, height = 1.0 / ncols, 1.0 / nrows
headers = 20

data  = np.zeros((nrows, ncols))

ax.set_xticks(np.arange(0.5,headers+0.5))
ax.set_yticks(np.arange(0.5,headers+0.5))
ax.xaxis.set_tick_params(labelsize=12)
ax.yaxis.set_tick_params(labelsize=12)
    

for (i,j),val in np.ndenumerate(data):
    tb.add_cell(i, j, width, height)
    tb.add_cell(i, j, width, height, loc='center')

tb.auto_set_font_size(False)
tb.set_fontsize(15)
ax.add_table(tb)
ax.set_aspect('equal')

plt.show()

有什么我遗漏的吗?

你听说过seaborn吗?这是一个建立在 matplotlib 之上的绘图库,可以为您处理这些事情。他们有一个函数 heatmap 正是这样做的,并自动处理刻度的放置:https://seaborn.pydata.org/generated/seaborn.heatmap.html#seaborn.heatmap

示例:

import seaborn as sns
ax = sns.heatmap(np.zeros(20,20))
plt.show()

给出了这个:

然后您可以使用刻度标签并随意修改它们,就像您在任何 matplotlib 图上所做的那样。例如,ax.set_xticklabels(np.arange(0.5, 20, 0.5)) 将像在您的图片上一样重命名您的 x-ticks。

这样就可以了

plt.ylim(0,headers)
plt.xlim(0,headers)

同时添加这一行 plt.xticks(rotation=90) 将帮助您在 x 轴上旋转值并避免重叠 完整的程序就像

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import os
import sys
from matplotlib.table import Table

fig, ax = plt.subplots(figsize=(15, 15))#
tb = Table(ax, bbox=[0, 0, 1, 1])

nrows, ncols = 20,20
width, height = 1.0 / ncols, 1.0 / nrows
headers = 20

data = np.zeros((nrows, ncols))

ax.set_xticks(np.arange(0.5,headers+0.5))
ax.set_yticks(np.arange(0.5,headers+0.5))
plt.ylim(0,headers)
plt.xlim(0,headers)
plt.xticks(rotation=90)
ax.xaxis.set_tick_params(labelsize=12)
ax.yaxis.set_tick_params(labelsize=12)

for (i, j), val in np.ndenumerate(data):
    tb.add_cell(i, j, width, height)
    tb.add_cell(i, j, width, height, loc='center')

tb.auto_set_font_size(False)
tb.set_fontsize(15)
ax.add_table(tb)
ax.set_aspect('equal')

plt.show()

输出

答案已通过大量试验和错误被接受,但我们正在改变想法和颜色映射。自定义它并使用热图来解决问题怎么样?处理各种事情会很方便。分享给大家,供大家参考。

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

mat = np.random.rand(10,10)

# RGB -> Hex
# ['rgb(0,0,205)', 'rgb(50,205,50)', 'rgb(255,69,0)'] -> ['#0000cd', '#32cd32', '#ff4500']
# ['mediumblue', 'limegreen', 'orangered'])
rgb_c = [(0,0,205), (50,205,50), (255,69,0)]
# RGB convert to Hex
cols = ['#%02x%02x%02x' % (c[0],c[1],c[2]) for c in rgb_c]

cm = matplotlib.colors.ListedColormap(cols)

fig, ax = plt.subplots()
heatmap = ax.pcolor(mat, cmap=cm)

ax.set_aspect('equal')

plt.show()