Python 记号与matplotlib表中的单元格不对齐

Python 记号与matplotlib表中的单元格不对齐,python,numpy,matplotlib,heatmap,Python,Numpy,Matplotlib,Heatmap,我正在使用matplotlib表创建包含不同值的热图。创建表格时,记号不会在x轴和y轴的每个单元格的中心对齐。 我想创造这样的东西。 但我得到的刻度在两个轴上并不一致。刻度从左下栏单元格的中间开始,移动到右上角单元格时会发生扭曲。 我正在使用此代码生成此matplotlip表 import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.colors import Lis

我正在使用matplotlib表创建包含不同值的热图。创建表格时,记号不会在x轴和y轴的每个单元格的中心对齐。 我想创造这样的东西。

但我得到的刻度在两个轴上并不一致。刻度从左下栏单元格的中间开始,移动到右上角单元格时会发生扭曲。

我正在使用此代码生成此matplotlip表

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之上的绘图库,可以为您处理这些事情。它们有一个功能
热图
,可以实现这一功能,并自动处理滴答声的放置:

例如:

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

然后,您可以像在任何matplotlib绘图上一样,随意使用标签并修改它们。例如,
ax.setxticklabels(np.arange(0.5,20,0.5))
将像图片上那样重命名您的x记号。

这样就可以了

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

使用
matplotlib.table
绘制热图有什么特殊原因吗?您可以使用
maptplotlib.pcolor
实现热图。使用Matplotlib表的原因是它需要根据RGB值(R、G、B)显示每个单元格的RGB颜色。RGB值将预先计算,并采用表格255255。我已经在每个单元格中实现了RGB颜色显示,但在对齐两个轴上的刻度时遇到了困难。我必须使用matplotlib表来显示为每个单元格计算的RGB颜色值。虽然使用Matplotlib可以很好地在简单的热图中对齐刻度,但在使用table之后,它的行为有些奇怪。非常感谢。您保存了my day.add
plt.xicks(rotation=90)
用于旋转Xaxis中的值我已经实现了旋转。这条路线是我唯一坚持的。谢谢你抽出时间。