【问题标题】:Create custom heatmap from pandas dataframe从熊猫数据框创建自定义热图
【发布时间】:2019-08-15 10:57:35
【问题描述】:

我有一个 8 行 6028 列的数据框。我想为第一列创建一个 8 行的热图(最终我将创建一个动画,以便地图更新阅读每一列)

这是数据帧的 sn-p:

                       value                    
percentage_time         0.00      0.15      0.16
region                                          
Anterior Distal     0.111212  0.119385  0.116270
Anterior Proximal   0.150269  0.153613  0.168188
Lateral Distal      0.130440  0.137157  0.136494
Lateral Proximal    0.171977  0.182251  0.181090
Medial Distal       0.077468  0.082064  0.082553
Medial Proximal     0.194924  0.198803  0.199339
Posterior Distal    0.164124  0.171221  0.166328
Posterior Proximal  0.131310  0.145706  0.136094

我使用了以下代码,但它为我提供了一个图,其中包含堆叠的索引和数据框中的所有数据:

sns.heatmap(region_pressure_data)

当我尝试使用以下代码获取第一列时,我得到以下信息:

sns.heatmap(region_pressure_data.ix[:,0:1])

理想情况下,我想要一张 8 个区域的地图,有 2 行(近端和远端)和 4 列(前部、外侧、后部、内侧),显示一列的数据。

如果有任何关于使用这种方法取得进展的建议,或者是否有更好的方法来应对挑战,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: python python-3.x pandas heatmap


    【解决方案1】:

    索引中的数据需要成为单元格的一部分,并且您可能需要一个数据透视表。 为了解释,我创建了一些列较少的类似数据框来说明我在做什么。我希望这是您使用的结构?

    df = pd.DataFrame(index=["Anterior Distal", "Anterior Proximal", "Lateral Distal", "Lateral Proximal"], data={0.:[1,2,3,4], 1.:[5,6,7,8]})
    print(df)                                                                     
    >>>
                       0.0  1.0
    region                     
    Anterior Distal      1    5
    Anterior Proximal    2    6
    Lateral Distal       3    7
    Lateral Proximal     4    8
    
    

    据我了解,您希望明确引用索引的两个部分,因此您需要先拆分索引。例如,您可以这样做,首先使用 pandas 方法拆分字符串,然后将其转换为可以切片的 numpy 数组

    index_parts = np.array(df.index.str.split().values.tolist())
    index_parts[:,0]
    >>> array(['Anterior', 'Anterior', 'Lateral', 'Lateral'], dtype='<U8')
    

    现在,您可以将它们添加为新列

    df["antlat"] = index_parts[:,0]
    df["distprox"] = index_parts[:,1]
    print(df)
    >>>
                       0.0  1.0    antlat  distprox
    region                                         
    Anterior Distal      1    5  Anterior    Distal
    Anterior Proximal    2    6  Anterior  Proximal
    Lateral Distal       3    7   Lateral    Distal
    Lateral Proximal     4    8   Lateral  Proximal
    

    然后您可以为您感兴趣的值创建枢轴

    df_pivot = df.pivot(index="antlat", columns="distprox", values=0.0)
    print(df_pivot)
    >>>
    distprox  Distal  Proximal
    antlat                    
    Anterior       1         2
    Lateral        3         4
    

    并绘制它(注意这只是 2x2,因为我没有在示例中添加内侧和后侧)

    sns.heatmap(df_pivot)
    

    【讨论】:

    • 非常感谢!抱歉延迟回复。我一直在研究您的有用答案。我现在离我的解决方案更近了,我只是在进行调整以使用我的完整数据框。感谢您的宝贵时间和细心的解释。
    【解决方案2】:

    为什么不直接使用matplotlib? :D

    import matplotlib.pyplot as plt
    plt.imshow(df.reset_index(drop=True).values[:,1:].astype("float"))
    

    【讨论】:

    • 您建议的代码不适用于我的数据。我得到一组空白的轴。当我用 matplotlib 做我的方法时,它比使用 seaborn 慢很多。
    • 如果您向我展示一些可重现的代码来获取您的数据框,我会为您提供帮助。否则不要指望我的答案是即插即用的:D
    猜你喜欢
    • 2019-01-18
    • 2017-09-05
    • 1970-01-01
    • 2021-09-26
    • 2013-10-12
    • 2021-10-14
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多