python 热图颜色,按百分比显示中间颜色的python热图

通常不希望更改颜色映射本身。相反,可以将值的标准化更改为颜色。为此目的

midpoint normalization

可以使用。明显的优点是,这个概念只适用于任何颜色映射,不需要为使用中的每个不同中值创建一个自定义值。

不幸的是,seaborn不允许使用自定义规范化。但是用matplotlib本身创建热图也同样容易,如

annotated_heatmap

例子。

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from matplotlib import colors

class MidpointNormalize(colors.Normalize):

def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):

self.midpoint = midpoint

colors.Normalize.__init__(self, vmin, vmax, clip)

def __call__(self, value, clip=None):

# I'm ignoring masked values and all kinds of edge cases to make a

# simple example...

x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]

return np.ma.masked_array(np.interp(value, x, y))

data = {

'row1': [90,95,99,50,50,45,0],

'row2': [99,98,100,100,98,99,80],

'row3': [98,97,99,100,96,95,98],

'row4': [99,98,100,100,98,99,100]

}

fig, ax = plt.subplots(figsize=(9, 4))

df = pd.DataFrame.from_dict(data,orient='index')

norm = MidpointNormalize(midpoint=np.median(df.values))

im = ax.imshow(df.values, cmap="YlGnBu", norm=norm)

fig.colorbar(im)

# Loop over data dimensions and create text annotations.

textcolors = ["k" ,"w"]

threshold = 55

for i in range(len(df)):

for j in range(len(df.columns)):

text = ax.text(j, i, df.values[i, j],

ha="center", va="center",

color=textcolors[df.values[i, j] > threshold])

plt.show()

97b640066e3dcffd05f85c2c78a44d61.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值