Python 记号与matplotlib表中的单元格不对齐
我正在使用matplotlib表创建包含不同值的热图。创建表格时,记号不会在x轴和y轴的每个单元格的中心对齐。 我想创造这样的东西。 但我得到的刻度在两个轴上并不一致。刻度从左下栏单元格的中间开始,移动到右上角单元格时会发生扭曲。 我正在使用此代码生成此matplotlip表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
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.addplt.xicks(rotation=90)
用于旋转Xaxis中的值我已经实现了旋转。这条路线是我唯一坚持的。谢谢你抽出时间。