海上热图的自定义刻度

时间:2018-11-11 11:18:32

标签: python matplotlib seaborn heatmap

我想绘制一些data作为热图,它实际上是一个50x50的numpy数组。结果,热图轴标签的范围是0到50,但实际上我希望轴标签的范围是-114到114,因为这是数据的范围。但是,当我设置刻度线标签时,它们最终会被束缚在轴上(见图)。

当我插入行中

  callMe(){
     fun1();
     fun2();
  }

  fun1(){
   ...
  }

  fun2(){
    ...
  }

热图最终会缩放(参见图片)。

我已经输入了代码和一些示例数据,也许有人可以发现我做错了。

ax.set_xticks(ticks)
ax.set_yticks(ticks)

Axis ticks all bunched up

Weird scaling issue

https://1drv.ms/u/s!Ap0up1KFhZOughZ3dx9rwq-9yiF9

1 个答案:

答案 0 :(得分:0)

@ImportanceOfBeingErnest向我指出,使用Seaborn的方法首先是错误的(请参阅评论)。因此,我更改了方法,该方法现在完全可以按我的意愿工作。万一其他人遇到这个问题,下面的代码将根据数据生成一个热图:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import cv2 as cv

font = {'family' : 'sans',
        'weight' : 'normal',
        'size'   : 18}
matplotlib.rc('font', **font)

filepath = "path/to/data/"
dataname = "data.txt"
filename = filepath + dataname

n_samples = (pd.read_csv(filename, delimiter="\t", skiprows=1, names=["x", "y", "value"])).values

x = n_samples[:, 0]
y = n_samples[:, 1]
z = n_samples[:, 2]

line_width = 2

yrange = int(np.ptp(x))
xrange = int(np.ptp(y))

x_values = np.unique(x).size
y_values = np.unique(y).size

num_ticks = 10
ticks = np.linspace(int(-yrange/2.), int(yrange/2.), num_ticks, dtype=np.int)

img = np.reshape(z, (x_values, y_values))
img = img.T
img = cv.resize(img, (yrange, xrange))

fig, ax = plt.subplots()
im = ax.imshow(img, cmap='viridis', extent=[-xrange/2., xrange/2., -yrange/2., yrange/2.])
ax.axvline(groundtruth[0], linestyle='--', c='r', linewidth=line_width)
ax.axhline(groundtruth[1], linestyle='--', c='r', linewidth=line_width)
ax.set_xlabel("$v_x$")
ax.set_ylabel("$v_y$")
cbar = fig.colorbar(im)
cbar.ax.set_yticklabels([''])
cbar.ax.set_ylabel('Reward')

fig.tight_layout()
savename = filepath + "hmap_" + bagname + "_" + reward + "_" + noise_level
fig.savefig(savename + ".pdf", transparent=True, bbox_inches='tight', pad_inches=0)
plt.close()
# plt.show()

输出如下所示: enter image description here