当我试图生成一个热图来比较不同用户段在不同时间段的表现时,我无法以EngFormatter风格自定义热图的注解(即1233 = 1k,10000 = 10k,2000000 = 2M等)。我无法找到FacetGrid中每个热图下的注解文本元素的位置。
如何自定义Facegrid Annotation的单位?
我的努力:
import matplotlib.pyplot as plt
import seaborn as sns
def draw_heatmap(*args, **kwargs):
data = kwargs.pop('data')
d = data.pivot(index=args[1], columns=args[0], values=args[2])
sns.heatmap(d, **kwargs)
fg = sns.FacetGrid(df, col='time_interval',height=6)
fg.map_dataframe(
draw_heatmap,
'user_action', 'segment', 'users',
cbar=True, cmap="Blues", square = True, annot=True,fmt='.2g'
)
from matplotlib.ticker import EngFormatter
for t in fg.texts: t.set_text(EngFormatter(t.get_text()))
电流输出:
所需输出:
与上述类似的可视化,但其中显示的热图文本注解为EngFormatter样式
样本数据集:
index,time_interval,user_action,segment,users
0,time_2,,Super Heavy,1233
1,time_1,Click Use,Medium,10000
2,time_1,Click View Detail,Light,2000000
3,time_2,Click View Detail,Medium,3999
4,time_1,Click See All,Medium,14542
会话信息:
polars==0.17.3
pandas==1.5.3
seaborn==0.12.2
1条答案
按热度按时间bqjvbblv1#
您已经非常接近正确了,但是将
Axes
对象的texts
属性的迭代和EngFormatter更改 * 放在draw_heatmap
函数中。您还需要捕获seaborn热图图本身的Axes
以修改其注解(即,不是FacetGrid的texts
属性,而是网格中热图的texts
属性)。例如,使用您提供的示例数据(为扩展演示而略有修改):
生产:
其中,上述随机生成的数据(“
df
”)为: