先放全部代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scipy.stats as ss
import seaborn as sns
import matplotlib
from pylab import *
matplotlib.rcParams['axes.unicode_minus']=False
mpl.rcParams['font.sans-serif'] = ['SimHei']
data_station = {
'1': [38, 202],
'2': [38, 202],
'3': [40, 202],
'4': [62, 202],
'5': [108, 202],
'6': [38, 202],
'7': [31, 123],
'8': [31, 123],
'9': [38, 123],
'10': [37, 123],
'11': [39, 123],
'12': [32, 123],
'13': [90, 316],
'14': [86, 316],
'15': [79, 316],
'16': [90, 316],
'17': [129, 316],
'18': [86, 316],
'19': [19, 60],
'20': [19, 60],
'21': [19, 60],
'22': [20, 60],
'23': [17, 60],
'24': [39, 60],
'25': [43, 175],
'26': [39, 175],
'27': [39, 175],
'28': [41, 175],
'29': [38, 175],
'30': [39, 175],
'31': [55, 142],
'32': [49, 142],
'33': [47, 142],
'34': [48, 142],
'35': [47, 142],
'36': [47, 142],
'37': [35, 139],
'38': [30, 139],
'39': [29, 139],
'40': [30, 139],
'41': [27, 139],
'42': [30, 139],
}
plt.figure(figsize=(5, 4)) # 设置图片尺寸,长比宽多一些
df3 = pd.DataFrame(data_station) # 需要生成dataframe格式
df4 = np.corrcoef(df3) # 生成相关系数矩阵
sns.heatmap(df4, vmin=-1, vmax=1, cmap=sns.color_palette('RdBu', n_colors=128), annot=True)
xx1 = [1, 2] # 设置刻度
labels = ['运行时间', '车站(站间距)'] # 刻度名称
plt.xticks([index - 0.5 for index in xx1], labels, rotation='horizontal') # 让刻度线在格子的中间
plt.yticks([index - 0.8 for index in xx1], labels, rotation='horizontal') # 没找到让文本居中的方法,所以智能靠平移让视觉上看起来文本居中
plt.yticks(rotation=90) # 旋转Y轴刻度
plt.show()

需要注意的是,heatmap需要dataframe格式的数据,可以通过生成dic转化成dataframe。
需要注意的是,生成的dataframe生成矩阵的时候不是按照列来的。虽然热力图中是2×2,但显然dataframe是42×2,因此需要考虑一下将数据转置输入dic。
如果有大佬直到怎么快捷解决这个办法,麻烦告知一下。
还有没解决的问题是,怎么把刻度标签居中。