如何基于另一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
相关产品推荐
相关产品推荐

