【问题标题】:Heatmap of minimum, median, maximum values in pythonpython中最小值,中值,最大值的热图
【发布时间】:2022-01-26 16:59:21
【问题描述】:

在下面的数据集中:

# Copy and paste the code below to get the dataframe output
import pandas as pd
import numpy as np
df= {
    'Gen':['M','M','M','M','F','F','F','F','M','M','M','M','F','F','F','F'],
    'Site':['FRX','FX','FRX','FRX','FRX','FX','FRX','FX','FX','FX','FX','FRX','FRX','FRX','FRX','FRX'],
    'Type':['L','L','L','L','L','L','L','L','R','R','R','R','R','R','R','R'],
     'AIC':['<1','<1','<1','<1',1,1,1,1,2,2,2,2,'>2','>2','>2','>2'],
     'AIC_TRX':[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4],
     'diff':[-1,-1,-1,-1,0,0,0,0,1,1,1,1,3,3,3,3],
     'series':[1,2,4,8,1,2,4,8,1,2,4,8,1,2,4,8],
    'Grwth_Time1':[150.78,162.34,188.53,197.69,208.07,217.76,229.48,139.51,146.87,182.54,189.57,199.97,229.28,244.73,269.91,249.19],
     'Grwth_Time2':[250.78,262.34,288.53,297.69,308.07,317.7,329.81,339.15,346.87,382.54,369.59,399.97,329.28,347.73,369.91,349.12],
     'Grwth_Time3':[240.18,232.14,258.53,276.69,338.07,307.74,359.16,339.25,365.87,392.48,399.97,410.75,429.08,448.39,465.15,469.33],
     'Grwth_Time4':[270.84,282.14,298.53,306.69,318.73,327.47,369.63,389.59,398.75,432.18,449.78,473.55,494.85,509.39,515.52,539.23],
      'Grwth_Time5':[25.78,22.34,28.53,27.69,30.07,17.7,29.81,33.15,34.87,32.54,36.59,39.97,29.28,34.73,36.91,34.12],
     'Grwth_Time6':[240.18,232.14,258.53,276.69,338.07,307.74,359.16,339.25,365.87,392.48,399.97,410.75,429.08,448.39,465.15,469.33],
     'Grwth_Time7':[27.84,28.14,29.53,30.69,18.73,27.47,36.63,38.59,38.75,24.18,24.78,21.55,13.85,9.39,15.52,39.23],
}
df = pd.DataFrame(df,columns = ['Gen','Site','Type','AIC','AIC_TRX','diff','series','Grwth_Time1','Grwth_Time2','Grwth_Time3','Grwth_Time4','Grwth_Time5','Grwth_Time6','Grwth_Time7'])
df.info()

df2 = df.groupby(['series', 'AIC_TRX'])[['Grwth_Time1', 'Grwth_Time2', 'Grwth_Time3', 
        'Grwth_Time4', 'Grwth_Time5', 'Grwth_Time6', 'Grwth_Time7']].mean().unstack()

输出:

我想做以下事情:

1.根据颜色阴影/色调创建热图-

  • 最大值:绿色
  • median_value : 黄色
  • minimum_value:红色
  1. 将热图输出导出为.xlsx 文件

我的尝试:

# 
df2.style.background_gradient(cmap='Blues').to_excel("output12272021.xlsx")

所需的输出应如下图所示,但使用 greenyellowred 色调

提前致谢

【问题讨论】:

  • pandas.pydata.org/docs/reference/api/… 检查文档以查看是否可以找到您正在寻找的调色板,如果这是您遇到的问题。开始编辑自定义低/高值可能会起作用,然后您也可以设置自定义值,例如 cmap='YlOrRd' 示例。
  • @LarrytheLlama,感谢您的尝试,我希望能够控制min_valuemedianmax_valuecmap 色调...... @987654337 @ 创建热图色调,但是,阴影不会相应地反映最小值、中值和最大值

标签: python pandas dataframe seaborn heatmap


【解决方案1】:

您可以编写自定义样式器。最大值和最小值很容易识别。但是,中位数是一个问题,因为列中可能没有与中位数完全相等的值。至于如何识别中间单元格,我就交给你了。

def styler(s: pd.Series) -> np.array:
    max_, median, min_ = s.agg(['max', 'median', 'min'])
    return np.select(
        [s == stat for stat in [max_, median, min_]],
        [f'background-color: {color}' for color in ['green', 'yellow', 'red']],
        ''
    )

df2.style.apply(styler, axis=0)

输出(导出到 Excel 之前):

【讨论】:

  • 差异,感谢您的尝试。 yellow 未反映在输出中。另外,我想要一个热图(所有值都根据它们与MaxMidpoint/medianMinimum values 的接近程度进行着色),显示greenyellowred 的各种阴影。例如最小值应该是solid red,下一个最小值应该是红色的较浅变化(请参阅原始帖子中的所需输出)。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2022-12-02
  • 2017-12-15
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多