【问题标题】:Ticks not aligned with the cell in matplotlib table刻度未与 matplotlib 表中的单元格对齐
【发布时间】:2020-11-06 23:06:37
【问题描述】:

我正在使用 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()

我有什么遗漏吗?

【问题讨论】:

  • matplotlib.table 绘制热图有什么特别的原因吗?可以使用maptplotlib.pcolor实现热图。
  • 使用Matplotlib table的原因是它需要根据RGB值(R,G,B)为每个单元格显示RGB颜色。 RGB 值将被预先计算,格式为 255,255,255。我已经在每个单元格中实现了 RGB 颜色显示,但在对齐两个轴上的刻度时遇到了困难。

标签: python numpy matplotlib heatmap


【解决方案1】:

这样就可以了

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

还添加此行 plt.xticks(rotation=90) 将帮助您在 xaxis 中旋转值并避免重叠 完整的程序会像

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

输出

【讨论】:

  • 添加 plt.xicks(rotation=90) 用于旋转 xaxis 中的值
  • 我已经实现了轮换。这种对齐是我唯一坚持的事情。感谢您的宝贵时间。
【解决方案2】:

你听说过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,就像您的图片一样。

【讨论】:

  • 我必须使用 matplotlib 表来显示为每个单元格计算的 RGB 颜色值。尽管使用 Matplotlib 的简单热图中的刻度很好地对齐,但使用 table 后表现有些奇怪。
【解决方案3】:

经过多次反复试验,我们已经接受了答案,但我们正在改变想法和颜色映射。如何自定义它并使用热图来解决问题?处理各种事情会很方便。我把它分享给你,供你参考。

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

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多