【问题标题】:Plotting a heatmap of dataframe values with 2 indices用 2 个索引绘制数据帧值的热图
【发布时间】:2022-07-19 21:23:51
【问题描述】:

我有一个这样的数据集:

1 1 0.5378291300966559
1 2 0.5536607043661815
2 2 0.5524941673147428
1 3 0.5736584823908455
2 3 0.5759360071103211
3 3 0.5874347294745028
1 4 0.5926563715142762
2 4 0.5928230196644817
3 4 0.5994333962893011
4 4 0.6093211865348295
1 5 0.6073769581157649
2 5 0.6092100877680258
3 5 0.6138206865903788
4 5 0.6182646372625263
5 5 0.6275413842906343

目标是绘制一个值的热图,其中前 2 列是轴,第 3 列是值。

我已将它们读出来,使其适合数据框并对其进行旋转:

data_str = """1 1 0.5378291300966559
1 2 0.5536607043661815
2 2 0.5524941673147428
1 3 0.5736584823908455
2 3 0.5759360071103211
3 3 0.5874347294745028
1 4 0.5926563715142762
2 4 0.5928230196644817
3 4 0.5994333962893011
4 4 0.6093211865348295
1 5 0.6073769581157649
2 5 0.6092100877680258
3 5 0.6138206865903788
4 5 0.6182646372625263
5 5 0.6275413842906343""".split('\n')

import pandas as pd


data = [{'min':line.split()[0], 'max':line.split()[1], 'score':line.split()[2]} for line in data_str]
df = pd.DataFrame(data, dtype=float).pivot('min', 'max', 'score')

当我在https://stackoverflow.com/a/59173863/610569 上尝试解决方案时,它只显示一条直线:

但我期望它绘制出我在分数列中的值的三角形热图。我应该如何进行策划?

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:

    我不确定你到底尝试了什么,但简单地将你的数据框绘制为图像对我来说效果很好

    data_str = """1 1 0.5378291300966559
    1 2 0.5536607043661815
    2 2 0.5524941673147428
    1 3 0.5736584823908455
    2 3 0.5759360071103211
    3 3 0.5874347294745028
    1 4 0.5926563715142762
    2 4 0.5928230196644817
    3 4 0.5994333962893011
    4 4 0.6093211865348295
    1 5 0.6073769581157649
    2 5 0.6092100877680258
    3 5 0.6138206865903788
    4 5 0.6182646372625263
    5 5 0.6275413842906343""".split('\n')
    
    import pandas as pd
    
    
    data = [{'min':line.split()[0], 'max':line.split()[1], 'score':line.split()[2]} for line in data_str]
    df = pd.DataFrame(data, dtype=float).pivot('min', 'max', 'score')
    
    # NEW CODE HEREUNDER
    import matplotlib.pyplot as plt
    plt.imshow(df)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      函数名称是get_lower_tri_heatmap,在你的df中,这将是较低的tri

      df#upper tri 
      Out[101]: 
      max       1.0       2.0       3.0       4.0       5.0
      min                                                  
      1.0  0.537829  0.553661  0.573658  0.592656  0.607377
      2.0       NaN  0.552494  0.575936  0.592823  0.609210
      3.0       NaN       NaN  0.587435  0.599433  0.613821
      4.0       NaN       NaN       NaN  0.609321  0.618265
      5.0       NaN       NaN       NaN       NaN  0.627541
      

      尝试将df.T 传递给函数

      get_lower_tri_heatmap(df.T)
      

      【讨论】:

        【解决方案3】:

        我认为您应该先定义一个空的 numpy 数组,然后再将值分配给它。应该看起来像这样:

        for line in t.splitlines():
        a[int(line.split()[0]) - 1][int(line.split()[1]) - 1] = line.split()[2]
        

        plt.imshow(a, cmap='hot', interpolation='最近的') plt.show()

        【讨论】:

          猜你喜欢
          • 2022-11-02
          • 2017-04-23
          • 2016-12-21
          • 1970-01-01
          • 1970-01-01
          • 2021-10-11
          • 1970-01-01
          • 2021-02-27
          • 1970-01-01
          相关资源
          最近更新 更多