如何自定义 seaborn 热图坐标并将任意数据放在热图中我想要的位置?
How to customize seaborn's heatmap's coordinate and put arbitary data to where I want in heatmap?
我有一个障碍,我有一个如下所示的数据集:
现在想把heatmap的X轴自定义成A-Z,Y轴也自定义,然后把dataset放到heatmap上,看来没办法满足我,除非把dataset改成下面的形式:
我的想法对吗?非常感谢。
Seaborn 为整个数据框创建热图,假设您使用的是 pandas。
我真的不明白你的问题。您想将 x 轴和 y 轴更改为字母顺序吗?如果是这样,我建议在生成热图之前按顺序排列数据。我确定 pandas 有一些功能可以做到这一点。如果我没有正确理解您的问题,请告诉我!
您可以将数据框与包含所有 x 和 y 值的虚拟数据框连接起来。在去重和旋转之后,将创建一个完整的矩阵(大多数值将是 nan
)。
这是一个例子。 LogNorm
用于着色,因为问题中的值范围似乎很宽。
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import seaborn as sns
import pandas as pd
import numpy as np
sns.set_style('white')
df = pd.DataFrame({'x': np.random.choice([*'KGORD'], 20),
'y': np.random.choice([*'CGLKU'], 20),
'extraction': 10000 ** np.random.uniform(0, 1, 20)})
df_dummy = pd.DataFrame({'x': [*'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],
'y': [*'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],
'extraction': np.nan})
keep='first').set_index(['x', 'y']).unstack()
df1 = pd.concat([df, df_dummy]) \
.drop_duplicates(subset=['x', 'y'], keep='first') \
.pivot(index='y', columns='x', values='extraction')
ax = sns.heatmap(data=df1, norm=LogNorm(), cmap='rocket_r')
ax.tick_params(labelrotation=0)
plt.tight_layout()
plt.show()
我有一个障碍,我有一个如下所示的数据集:
现在想把heatmap的X轴自定义成A-Z,Y轴也自定义,然后把dataset放到heatmap上,看来没办法满足我,除非把dataset改成下面的形式:
Seaborn 为整个数据框创建热图,假设您使用的是 pandas。 我真的不明白你的问题。您想将 x 轴和 y 轴更改为字母顺序吗?如果是这样,我建议在生成热图之前按顺序排列数据。我确定 pandas 有一些功能可以做到这一点。如果我没有正确理解您的问题,请告诉我!
您可以将数据框与包含所有 x 和 y 值的虚拟数据框连接起来。在去重和旋转之后,将创建一个完整的矩阵(大多数值将是 nan
)。
这是一个例子。 LogNorm
用于着色,因为问题中的值范围似乎很宽。
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import seaborn as sns
import pandas as pd
import numpy as np
sns.set_style('white')
df = pd.DataFrame({'x': np.random.choice([*'KGORD'], 20),
'y': np.random.choice([*'CGLKU'], 20),
'extraction': 10000 ** np.random.uniform(0, 1, 20)})
df_dummy = pd.DataFrame({'x': [*'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],
'y': [*'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],
'extraction': np.nan})
keep='first').set_index(['x', 'y']).unstack()
df1 = pd.concat([df, df_dummy]) \
.drop_duplicates(subset=['x', 'y'], keep='first') \
.pivot(index='y', columns='x', values='extraction')
ax = sns.heatmap(data=df1, norm=LogNorm(), cmap='rocket_r')
ax.tick_params(labelrotation=0)
plt.tight_layout()
plt.show()