简体   繁体   English

海上热图的自定义刻度

[英]Custom ticks for seaborn heatmap

I have some data that I would like to plot as a heatmap, it is essentially a 50x50 numpy array. 我有一些数据 ,我想绘制为热图,它本质上是一个50×50阵列numpy的。 As a result the heatmap axis labels range from 0 to 50, but actually I want the axis labels to go from -114 to 114 since this is the range of the data. 结果,热图轴标签的范围是0到50,但实际上我希望轴标签的范围是-114到114,因为这是数据的范围。 When I set the tick labels however, they end up being bunched up on the axes (see image). 但是,当我设置刻度线标签时,它们最终会被束缚在轴上(见图)。

When I put in the lines 当我排队时

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

The heatmap ends up getting scaled (see image). 热图最终会缩放(参见图片)。

I have put in my code and some sample data, maybe someone can spot what I have done wrong. 我已经输入了代码和一些示例数据,也许有人可以发现我做错了什么。

import sys
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import os
import cv2 as cv
import seaborn as sns;

filepath = sys.argv[1]
drive, path_and_file = os.path.splitdrive(filepath)
path, file = os.path.split(path_and_file)

line_width = 3

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

bagnames = ["hex_events_only.bag"]
groundtruth = [-92, 0]
noise_levels = ["-1.000000"]
rewards = ["sos"]

gt_angle = np.arctan2(groundtruth[0], groundtruth[1])
gt_mag = np.linalg.norm(groundtruth, axis=0)
print(gt_angle, gt_mag)

for bagname in bagnames:
    print "==========", bagname, "=========="
    for reward in rewards:
        print "      ---", reward, "---       "
        for noise_level in noise_levels:
                filename = filepath + "data_field_" + bagname + "_" + reward + "_" + noise_level
                print filename
                n_samples = (pd.read_csv(filename, delimiter="\t", skiprows=1, names=["vx", "vy", "measure"])).values

                x = n_samples[:, 0]
                y = n_samples[:, 1]
                z = n_samples[:, 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))

                savename = filepath + "hmap_" + bagname + "_" + reward + "_" + noise_level

                fig, ax = plt.subplots()

                img = cv.GaussianBlur(img, (5, 5), 0)
                ax = sns.heatmap(img, cmap='viridis', yticklabels=ticks, xticklabels=ticks)

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

                # ax.axvline(groundtruth[0], linestyle='--', c='r', linewidth=line_width)
                # ax.axhline(groundtruth[1], linestyle='--', c='r', linewidth=line_width)
                plt.show()
                fig.savefig(savename + ".png", transparent=True, bbox_inches='tight', pad_inches=0)
                plt.close()

轴滴答声全部聚集

怪异的缩放问题

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

@ImportanceOfBeingErnest pointed out to me that the approach of using Seaborn was wrong in the first place (see comments). @ImportanceOfBeingErnest向我指出,使用Seaborn的方法首先是错误的(请参阅评论)。 So I changed the approach, which now works exactly as I want it to. 因此,我更改了方法,该方法现在完全可以按我的意愿工作。 In case anyone else runs into this problem, the following code with generate a heatmap from data: 万一其他人遇到此问题,以下代码可从数据生成热图:

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

Here's what the output is like: 输出是这样的: 在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM