【问题标题】:Seaborn PairPlot to plot matrix error of each individual entrySeaborn PairPlot 绘制每个单独条目的矩阵误差
【发布时间】:2021-10-15 13:21:36
【问题描述】:

我有四个 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 列和 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 中,还是我必须事先做其他事情才能达到预期的结果。非常感谢任何帮助!

【问题讨论】:

    标签: python pandas dataframe matplotlib seaborn


    【解决方案1】:

    您无法按照您的描述进行操作:为了绘制散点图,您需要两个变量,一个用于 x 轴,一个用于 y 轴。使用您的数据集,您将获得一个 5x5 网格的子图,每个子图将包含 4 个点(每个 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):

    【讨论】:

    • 太棒了!非常感谢您的详细回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多