【问题标题】:How can a heatmap be made from bin edges and values for each bin stored in a Pandas dataframe?如何从存储在 Pandas 数据框中的每个 bin 的 bin 边缘和值制作热图?
【发布时间】:2020-03-18 17:37:10
【问题描述】:

我使用cut 函数在 Pandas 数据帧中定义了 2D bin 边缘。我正在尝试了解如何将这些 bin 边缘和每个 bin 的各种值转换为热图。

我从 iris 数据集开始,并对其进行UMAP 投影,这样我就有每个数据点的UMAP x 和 y 坐标。

我使用cut 函数将其转换为网格单元,从而在 x 和 y 中产生 bin 边缘。然后我得到每个网格单元对应的特征的平均值。

现在,如何从这个变成热图,比如 Seaborn 热图?逐个特征地采用这个特征,第一个将是每个 2D bin(UMAP_x_bin、UMAP_y_bin)的 sepal length (cm)_mean 值的热图。

import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.datasets import load_iris
import umap # pip install umap-learn

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['species'] = pd.Series(iris.target).map(dict(zip(range(3), iris.target_names)))

_umap = umap.UMAP().fit_transform(iris.data)
iris_df['UMAP_x'] = _umap[:,0]
iris_df['UMAP_y'] = _umap[:,1]
#iris_df.head()

# Define bins for UMAP_x and UMAP_y parameters
iris_df['UMAP_x_bin'] = pd.cut(iris_df['UMAP_x'], bins=25)
iris_df['UMAP_y_bin'] = pd.cut(iris_df['UMAP_y'], bins=25)
# Calculate the mean value for each bin.
for feature in ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']:
    iris_df[feature+'_mean_x'] = iris_df.groupby('UMAP_x_bin')[feature].transform('mean')
    iris_df[feature+'_mean_y'] = iris_df.groupby('UMAP_y_bin')[feature].transform('mean')
    iris_df[feature+'_mean'] = (iris_df[feature+'_mean_x']+iris_df[feature+'_mean_y'])/2
#iris_df.head()

features_trimmed = ['UMAP_x_bin',
                    'UMAP_y_bin',
                    'sepal length (cm)_mean',
                    'sepal width (cm)_mean',
                    'petal length (cm)_mean',
                    'petal width (cm)_mean']
iris_df = iris_df[features_trimmed]
iris_df.head()

【问题讨论】:

    标签: pandas matplotlib seaborn heatmap


    【解决方案1】:

    首先,您需要将IntervalIndex 列转换为单值列。

    iris_df .UMAP_x_bin= iris_df .UMAP_x_bin.apply(lambda x: x.mid)
    iris_df .UMAP_y_bin= iris_df .UMAP_x_bin.apply(lambda x: x.mid)
    

    然后您必须将数据插入到二维值网格中。 您可以为此使用scipy。

    from scipy.interpolate import griddata
    
    points = np.c_[iris_df .UMAP_x_bin, iris_df .UMAP_y_bin]
    values = iris_df ['sepal length (cm)_mean'].to_numpy()
    
    # Choose the range appropriately.
    gridx, gridy = np.mgrid[0:100, 0:100]
    
    # interpolate.
    data = griddata(points, values, (gridx, gridy), method = 'nearest')
    
    # plot the heatmap
    sns.heatmap(data)
    
    

    PS。 Choose the grid range appropriately, according to the range of UMap_x_bin and UMap_y_bin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2019-03-30
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多