如何在Tableau中按每个窗格的平均值为条形图上色

实现方案
核心逻辑非常简单:你之前只能用全局均值上色,是因为计算均值时没有按分面字段分组。只要先按你用来划分窗格的字段做分组聚合,算出每个分组对应的平均值,再把这个分组均值关联回原始数据,就可以用每个样本对应的分组均值作为阈值判断高低,进而实现按单窗格均值上色的需求。
R + ggplot2 实现示例
假设分面字段为category,数值字段为value,条形分类字段为sub_category:
library(tidyverse) # 计算每个分面的均值并写入原数据集 df <- df %>% group_by(category) %>% mutate(facet_mean = mean(value, na.rm = TRUE)) %>% ungroup() # 绘图 ggplot(df, aes(x = sub_category, y = value, fill = value > facet_mean)) + geom_col() + # 添加分面均值红色虚线 geom_hline(aes(yintercept = facet_mean), color = "red", linetype = "dashed") + # 分面设置,scales参数可根据需求调整为固定或者自适应 facet_wrap(~category, scales = "free") + # 自定义颜色,可自行替换 scale_fill_manual(values = c("TRUE" = "#1f77b4", "FALSE" = "#ff7f0e"))
Python + seaborn 实现示例
字段定义和上方一致:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 计算每个分面的均值 df['facet_mean'] = df.groupby('category')['value'].transform('mean') # 新增是否高于分面均值的判断字段 df['above_facet_mean'] = df['value'] > df['facet_mean'] # 初始化分面画布 g = sns.FacetGrid(df, col="category", sharex=False, sharey=False, height=4, aspect=1) # 绘制分面条形图 g.map_dataframe( sns.barplot, x="sub_category", y="value", hue="above_facet_mean", palette={True: "#1f77b4", False: "#ff7f0e"}, dodge=False ) # 给每个子图添加红色均值虚线 for ax, (facet_name, facet_data) in zip(g.axes.flat, df.groupby('category')): ax.axhline(facet_data['facet_mean'].iloc[0], color='red', linestyle='--') # 添加图例 g.add_legend() plt.show()
如果是二维分面(同时按行、列两个字段划分窗格),只需要把分组聚合的字段改成两个分面字段的组合即可,逻辑完全相同。
内容的提问来源于stack exchange,提问作者Kimberley
相关产品推荐
相关产品推荐

