如何为Matplotlib单个水平条形图添加平滑过渡的发散配色方案
单水平条形发散渐变配色实现方案
纯Matplotlib实现
核心思路是先绘制发散渐变图层,再用水平条形作为裁剪区域,仅保留条形范围内的渐变显示。
import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap # 自定义发散配色,可根据需求替换颜色列表,当前为左蓝-中白-右红的经典发散色 diverge_cmap = LinearSegmentedColormap.from_list('custom_diverge', ['#2166ac', 'white', '#b2182b']) plt.figure(figsize=(4, 1)) # 绘制覆盖x轴[-1,1]区间的渐变图层 gradient_layer = plt.imshow( [[0, 1]], aspect='auto', cmap=diverge_cmap, extent=[-1, 1, -0.5, 0.5] ) # 绘制水平条形作为裁剪模板,填充色设为透明 bar = plt.barh( ['my_value'], height=0.1, width=[-1, 1], align='center', color='none' )[0] # 把渐变图层裁剪到仅条形区域可见 gradient_layer.set_clip_path(bar) # 保留原有辅助竖线 plt.axvline(x=0.8, color='black') # 调整y轴范围避免显示异常 plt.ylim(-0.5, 0.5) plt.show()
Seaborn实现方案
可以直接调用Seaborn内置的成熟发散调色板,无需自定义色值:
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(4, 1)) # 直接使用Seaborn内置发散调色板,可替换为coolwarm、RdBu_r等其他发散色系 diverge_cmap = sns.color_palette("vlag", as_cmap=True) gradient_layer = plt.imshow( [[0, 1]], aspect='auto', cmap=diverge_cmap, extent=[-1, 1, -0.5, 0.5] ) bar = plt.barh( ['my_value'], height=0.1, width=[-1, 1], align='center', color='none' )[0] gradient_layer.set_clip_path(bar) plt.axvline(x=0.8, color='black') plt.ylim(-0.5, 0.5) plt.show()
内容的提问来源于stack exchange,提问作者Bade
相关产品推荐
相关产品推荐

