【发布时间】: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