Python Seaborn热图中按行显示的颜色比例

Python Seaborn热图中按行显示的颜色比例,python,data-visualization,seaborn,Python,Data Visualization,Seaborn,我想在Seaborn制作热图,那里的颜色是按行缩放的。我的意思是,一行中的最高值在图例上具有最高的颜色,而一行中的最低值-最低。我怎么做呢 这是我的代码: sales = sales.pivot_table(index='Sources', columns='Category', values='Value') sns.heatmap(sales,annot=True, cmap='coolwarm',fmt='g',linewidths=1,linecolor='black',).set_t

我想在Seaborn制作热图,那里的颜色是按行缩放的。我的意思是,一行中的最高值在图例上具有最高的颜色,而一行中的最低值-最低。我怎么做呢

这是我的代码:

sales = sales.pivot_table(index='Sources', columns='Category', values='Value')

sns.heatmap(sales,annot=True, cmap='coolwarm',fmt='g',linewidths=1,linecolor='black',).set_title('Sales')
这是我从中得到的热图


使用
numpy.argsort
可以找到每行中值的顺序。使用结果作为着色的基础将为您提供每行的映射

import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedFormatter

data = np.random.randint(1,250, size=(10,6))
b = np.argsort(np.argsort(data, axis=1), axis=1)

im = plt.imshow(b, aspect="auto", cmap="coolwarm")
plt.colorbar(im, ticks=np.array([0.0, 0.5, 1.0])*b.max(), 
             format=FixedFormatter(["low", "middle", "high"]))

for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        plt.text(j,i,data[i,j], ha="center", va="center")

plt.show()

使用pandas将每行除以其最大值,我们得到一种颜色,其中最大值为深红色,其他列则取决于它们与最大值的关系。因此,几乎等于最大值的列将是较轻的ted。只有一半销售额的栏目将被涂成白色。几乎没有销售的专栏将是蓝色的

颜色栏指示与每行最大值相比的百分比

将熊猫作为pd导入
导入seaborn作为sns
从matplotlib导入pyplot作为plt
随机输入
资料来源=['A','B','C','D','E','F','G']
类别=[f'Cat{i}表示范围(1,5)内的i]
数据=[[s,c,random.randint(2,50)],源代码中的s,类别中的c]
sales=pd.DataFrame(数据,列=['Sources','Category','Value'])
#创建按源和类别分组的数据帧
per_source_cat=sales.groupby(['Sources','Category']).agg({'Value':'sum'})
#计算每个源的最大值
max_per_source=sales.groupby(['Sources']).agg({'Value':'max'})
#将每个来源的销售额除以该来源的最大销售额
per_source_cat=per_source_cat.div(最大per_source,level='Sources')*100
#转换为数据透视表
per_source_cat=per_source_cat.pivot_表(索引='Sources',列='Category',值='Value')
#将销售数据转换为兼容的数据透视表
sales=sales.pivot_表(index='Sources',columns='Category',values='Value')
sns.heatmap(根据来源分类,cmap='coolwarm',annot=sales,fmt='g',线宽=1,linecolor='black',)设置标题(“sales”)
plt.show()

或者,假设您要将最高的红色和最低的蓝色分别着色,不管它们是否靠近。然后,减去最小值,再除以最大值和最小值之间的差值,就可以定义颜色。完全相等的行会导致除零,这可以使用
fillna
处理

#创建按源和类别分组的数据帧
per_source_cat=sales.groupby(['Sources','Category']).agg({'Value':'sum'})
#计算每个源的最大值和最小值
max_per_source=sales.groupby(['Sources']).agg({'Value':'max'})
min_per_source=sales.groupby(['Sources']).agg({'Value':'min'})
#减去最小值,然后除以最大值和最小值之间的差值
per_source_cat=(per_source_cat-min_per_source)/(max_per_source-min_per_source)*100
#如果全部相等,将有一个除以0的除法,将每个值设置为100%
per_source_cat=per_source_cat.fillna(100.0)


现在,颜色栏显示最高的为100%,最低的为0%,其他的按比例着色。

Giepards地图在我看来还可以。你期待什么?