You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一DataFrame的条件为sns.barplot柱状图自定义着色

实现方法

核心思路是预先按x轴固定顺序匹配df2的数值,根据数值大小生成对应颜色列表,再传入绘图参数,不需要调整原始数据的排序。

完整可运行代码示例

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

# 1. 定义固定的x轴顺序、y轴数值(对应你的df1数据)
x_order = ['A','B','C','D','E','F','G']
y_values = [10,40,20,5,60,30,80]

# 2. 构造示例df2,实际使用时替换为你自己的df2即可
df2 = pd.Series([90,70,40,30,30,20,80], index=['A','B','C','D','E','F','G'])

# 3. 按x轴固定顺序取df2对应数值,计算排名
# method='dense'保证相同数值排名一致,最终对应同色;ascending=False表示数值越大排名越靠前
df2_ordered = df2.loc[x_order]
ranks = df2_ordered.rank(method='dense', ascending=False).astype(int) - 1

# 4. 按排名生成对应颜色列表
palette = sns.color_palette("Blues_r", n_colors=ranks.nunique())
color_list = [palette[r] for r in ranks]

# 5. 绘图,传入自定义颜色列表即可
sns.barplot(x=x_order, y=y_values, palette=color_list)
plt.show()

参数调整说明

  • 若需要相同数值的柱子使用相邻色而非同色,把rank方法的method参数改为'first'即可,相同数值的项会按x轴出现顺序分配连续排名,对应调色盘相邻色,不会有其他颜色插入二者之间。
  • 若需要数值越小颜色越深,删除rank方法里的ascending=False参数即可。

内容的提问来源于stack exchange,提问作者Veki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:54:04