Seaborn Facetgrid 中热图的变化

问题描述 投票:0回答:2

提前抱歉图像数量过多,但它们有助于演示问题

我已经构建了一个数据框,其中包含多个基材、多个层的薄膜厚度测量值,作为坐标的函数:

|    | Sub | Result | Layer | Row | Col |
|----|-----|--------|-------|-----|-----|
|  0 |   1 |   2.95 | 3 - H |   0 |  72 |
|  1 |   1 |   2.97 | 3 - V |   0 |  72 |
|  2 |   1 |   0.96 | 1 - H |   0 |  72 |
|  3 |   1 |   3.03 | 3 - H | -42 |  48 |
|  4 |   1 |   3.04 | 3 - V | -42 |  48 |
|  5 |   1 |   1.06 | 1 - H | -42 |  48 |
|  6 |   1 |   3.06 | 3 - H |  42 |  48 |
|  7 |   1 |   3.09 | 3 - V |  42 |  48 |
|  8 |   1 |   1.38 | 1 - H |  42 |  48 |
|  9 |   1 |   3.05 | 3 - H | -21 |  24 |
| 10 |   1 |   3.08 | 3 - V | -21 |  24 |
| 11 |   1 |   1.07 | 1 - H | -21 |  24 |
| 12 |   1 |   3.06 | 3 - H |  21 |  24 |
| 13 |   1 |   3.09 | 3 - V |  21 |  24 |
| 14 |   1 |   1.05 | 1 - H |  21 |  24 |
| 15 |   1 |   3.01 | 3 - H | -63 |   0 |
| 16 |   1 |   3.02 | 3 - V | -63 |   0 |

并且这种情况持续到 >10 个子节点(每批),每个子节点 13 个站点,以及 3 层 - 这个

df
是一个复合材料。 我正在尝试将数据呈现为热图的facetgrid(改编自How to make heatmap square in Seaborn FacetGrid - 谢谢!)

我可以很高兴地绘制

df
的子集:

spam = df.loc[df.Sub== 6].loc[df.Layer == '3 - H']
spam_p= spam.pivot(index='Row', columns='Col', values='Result')

sns.heatmap(spam_p, cmap="plasma")

enter image description here

但是 - 有一些缺失的结果,其中层测量错误(返回“10000”),所以我用 NaN 替换了这些结果:

df.Result.replace(10000, np.nan)

Single seaborn heatmap with correct axes

要绘制facetgrid以显示所有子/层,我编写了以下代码:

def draw_heatmap(*args, **kwargs):
    data = kwargs.pop('data')
    d = data.pivot(columns=args[0], index=args[1], 
    values=args[2])
    sns.heatmap(d, **kwargs)

fig = sns.FacetGrid(spam, row='Wafer', 
col='Feature', height=5, aspect=1)

fig.map_dataframe(draw_heatmap, 'Col', 'Row', 'Result', cbar=False, cmap="plasma", annot=True, annot_kws={"size": 20})

产生:

heatmap image with incomplete axes plot

它会自动调整轴,以不显示任何存在 NaN 的位置。 我尝试过屏蔽(请参阅https://github.com/mwaskom/seaborn/issues/375),但只是出现错误

Inconsistent shape between the condition and the input (got (237, 15) and (7, 7))

其结果是,当不使用裁剪后的数据集时(即

df
而不是
spam
,代码会生成以下 Facetgrid):

enter image description here

在极端(边缘)坐标位置处具有缺失值的图使图在轴内移动 - 这里所有明显都在左上角。 Sub #5,第 3-H 层应如下所示:

enter image description here

即有

NaN
的地方留白。

为什么facetgrid 将整个图向上和/或向左移动?另一种方法是根据子/层计数动态生成子图(呃!)。

非常感谢您的帮助。

sub 5 的 2 层的完整数据集:

    Sub Result  Layer   Row     Col
0   5   2.987   3 - H   0       72
1   5   0.001   1 - H   0       72
2   5   1.184   3 - H   -42     48
3   5   1.023   1 - H   -42     48
4   5   3.045   3 - H   42      48 
5   5   0.282   1 - H   42      48
6   5   3.083   3 - H   -21     24 
7   5   0.34    1 - H   -21     24
8   5   3.07    3 - H   21      24
9   5   0.41    1 - H   21      24
10  5   NaN     3 - H   -63     0
11  5   NaN     1 - H   -63     0
12  5   3.086   3 - H   0       0
13  5   0.309   1 - H   0       0
14  5   0.179   3 - H   63      0
15  5   0.455   1 - H   63      0
16  5   3.067   3 - H   -21    -24
17  5   0.136   1 - H   -21    -24
18  5   1.907   3 - H   21     -24
19  5   1.018   1 - H   21     -24
20  5   NaN     3 - H   -42    -48
21  5   NaN     1 - H   -42    -48
22  5   NaN     3 - H   42     -48
23  5   NaN     1 - H   42     -48
24  5   NaN     3 - H   0      -72
25  5   NaN     1 - H   0      -72
python pandas seaborn heatmap facet-grid
2个回答
2
投票

您可以创建唯一列和行标签的列表,并用它们重新索引数据透视表。

cols = df["Col"].unique()
rows = df["Row"].unique()

pivot = data.pivot(...).reindex_axis(cols, axis=1).reindex_axis(rows, axis=0)

此答案所示。

一些完整的代码:

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

r = np.repeat([0,-2,2,-1,1,-3],2)
row = np.concatenate((r, [0]*2, -r[::-1]))
c = np.array([72]*2+[48]*4 + [24]*4 + [0]* 3)
col = np.concatenate((c,-c[::-1]))

df = pd.DataFrame({"Result" : np.random.rand(26),
                   "Layer" : list("AB")*13,
                   "Row" : row, "Col" : col})

df1 = df.copy()
df1["Sub"] = [5]*len(df1)
df1.at[10:11,"Result"] = np.NaN
df1.at[20:,"Result"] = np.NaN

df2 = df.copy()
df2["Sub"] = [3]*len(df2)
df2.at[0:2,"Result"] = np.NaN

df = pd.concat([df1,df2])

cols = np.unique(df["Col"].values)
rows = np.unique(df["Row"].values)

def draw_heatmap(*args, **kwargs):
    data = kwargs.pop('data')
    d = data.pivot(columns=args[0], index=args[1], 
                   values=args[2])
    d = d.reindex_axis(cols, axis=1).reindex_axis(rows, axis=0)
    print d
    sns.heatmap(d,  **kwargs)

grid = sns.FacetGrid(df, row='Sub', col='Layer', height=3.5, aspect=1 )

grid.map_dataframe(draw_heatmap, 'Col', 'Row', 'Result', cbar=False, 
                  cmap="plasma", annot=True)

plt.show()

enter image description here


0
投票

这个(https://stackoverflow.com/a/51883445/26396303)仍然有效,但是 pd.reindex_axis() 在较新版本的 pandas 中被称为 pd.reindex()

© www.soinside.com 2019 - 2024. All rights reserved.