我使用热图是因为其最终结构,而不是色域本身。
我在下面展示一个小例子。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from pdb import set_trace as bp
dic_data = {'x': [1, 1, 2, 2, 3, 2, 2, 3, 2, 4, 4, 5],
'y': [1, 2, 3, 4, 4, 4, 3, 2, 1, 2, 2, 2],
'note': [1, 4, 9, 16, 20, 16, 9, 10, 4, 14, 16, 16]}
df = pd.DataFrame.from_dict(dic_data)
df_p = df.groupby(['x', 'y'])['note'].count().reset_index()
df_p = df_p.pivot_table('note', 'y', 'x', fill_value = 0).sort_index(level = 0, ascending = False)
dic_parse = {'y': {1: 'Very low',
2: 'Low',
3: 'Normal',
4: 'High'},
'x': {1: 'VL',
2: 'L',
3: 'N',
4: 'H',
5: 'VH'}}
xticklabels = [dic_parse['x'][e] for e in df_p.keys().tolist()]
yticklabels = [dic_parse['y'][e] for e in df_p.index.tolist()]
f, ax = plt.subplots(figsize = (9, 6))
sns.heatmap(df_p, annot = True, fmt = 'd', linewidths = .5, cbar = False, cmap = 'Greens',
annot_kws = {'size': 50}, xticklabels = xticklabels, yticklabels = yticklabels)
ax.set_xlabel('x', fontsize = 20)
ax.set_ylabel('y', fontsize = 20)
ax.set_ylim([df_p.size / len(df_p.columns), 0])
plt.show()
这应该是执行以下代码的结果:
我要实现的是选择每个单元格中出现的颜色,以使左下三角形为红色(从(N-非常低)和(VL-Normal)到下方),右上三角形为绿色(从(N高)和(VH低)到上方),中间区域为黄色。
这是我的愿望结果:
我不知道这是否可以通过热图或其他功能实现。
非常感谢您。