首页 > 解决方案 > Seaborn PairPlot 绘制每个单独条目的矩阵误差

问题描述

我有四个 5x5 矩阵,我想将它们与一个“原始”矩阵进行比较。我计算了每个矩阵的误差,这会产生一个新的 5x5 矩阵,其中每个条目都有百分比误差。

例如:Matrix_W

     Ac   Bc   Cc   Dc   Ec

Ar  0.04 0.03 0.02 0.05 0.06

Br  0.01 0.02 0.04 0.02 0.01

Cr  0.03 0.05 0.09 0.08 0.01

Dr  0.07 0.09 0.05 0.03 0.01

Er  0.01 0.03 0.05 0.05 0.08

(r 代表行,c 代表列)

我将其中四个矩阵存储在 pandas DataFrame 中:

 Ac   Bc   Cc   Dc   Ec   rowValue   mType
0.04 0.03 0.02 0.05 0.06     Ar       W
0.01 0.02 0.04 0.02 0.01     Br       W
0.03 0.05 0.09 0.08 0.01     Cr       W
0.07 0.09 0.05 0.03 0.01     Dr       W
0.01 0.03 0.05 0.05 0.08     Er       W
0.04 0.04 0.03 0.01 0.02     Ar       X
0.09 0.07 0.05 0.04 0.01     Br       X
0.01 0.02 0.06 0.05 0.07     Cr       X
            ……
0.06 0.08 0.04 0.03 0.09     Er       Z

现在,我想使用 seaborn 创建一个 5x5 散点图矩阵来绘制四个矩阵中的每一个的误差。与此类似,只有 5 列和行:

因此,散点图矩阵的单元格 0,0(左上角)应显示四个矩阵的 Ac、Ar 位置的误差图。散点图矩阵的 x 轴和 y 轴是独立的:x_vars = Ac up to Ec; y_vars= Ar 到 Er。hue应该取决于mType变量。

以下代码没有导致所需的输出:

Import Seaborn as sns

g = sns.PairGrid(df, x_vars=df.columns[:-2], y_vars=df[‚rowValue‘], hue=df[‚mType‘])
g.map(sns.scatterplot)

我得到的结果是一个 20x5 矩阵,它似乎没有独立的 x 和 y 轴。我不确定问题是我如何将数据存储在 DataFrame 中,还是我必须事先做其他事情才能达到预期的结果。任何帮助深表感谢!

标签: pythonpandasdataframematplotlibseaborn

解决方案


您不能按照您的描述进行操作:为了绘制散点图,您需要两个变量,一个用于 x 轴,一个用于 y 轴。使用您的数据集,您将获得一个 5x5 的子图网格,每个子图将包含 4 个点(每个 1 个mType),但是哪些其他变量决定了这 4 个点在该子图中的位置?


我建议你使用不同的方法。
您可以绘制 4 个不同的 5x5 热图,每个热图一个mType。这些热图的每个单元格都有一个基于其值的颜色。

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from string import ascii_uppercase


# user input
np.random.seed(42)
matrix_size = 5
matrices = ['W', 'X', 'Y', 'Z']


# dataframe creation
n_matrix = len(matrices)
row_labels = [f'{lecter}r' for lecter in ascii_uppercase[:matrix_size]]
col_labels = [f'{lecter}c' for lecter in ascii_uppercase[:matrix_size]]

df = pd.DataFrame({'mType': np.repeat(matrices, matrix_size),
                   'rowValue': n_matrix*row_labels})

for col in col_labels:
    df[col] = 0.05 + 0.01*np.random.randn(matrix_size*n_matrix)


# plotting
fig, ax = plt.subplots(1, n_matrix, figsize = (5*n_matrix, 5))

for i, mtype in enumerate(df['mType'].unique(), 0):
    cbar = False if i != n_matrix - 1 else True
    sns.heatmap(ax = ax[i],
                data = df.loc[df['mType'] == mtype, col_labels],
                vmin = 0.02,
                vmax = 0.08,
                annot = True,
                cbar = cbar,
                cmap = 'Spectral_r')
    ax[i].tick_params(left = False, bottom = False)
    ax[i].set_yticklabels(df['rowValue'].unique())
    ax[i].set_title(mtype)

plt.show()

上面的代码适用于任意数量的矩阵和任意矩阵大小。
在您的情况下(4 个矩阵,大小 5):

在此处输入图像描述


推荐阅读