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

如何用Python绘制带同色淡色延伸段的价格变化条形图

实现两年帽子价格条形图的延伸展示

原始数据与现有代码

第一年帽子价格数据

Hat     Dollars
----------------------
0    Blue          33
1   Green          42
2     Red          54 

现有条形图代码

dataplot = sns.barplot(x = 'Hat',
            y = 'Dollars',
            data = df,hue='Hat')
plt.gca().set_xticklabels([])
plt.ylabel("Dollars", fontsize=15)
plt.xlabel("Hat", fontsize=0)
plt.legend(title="Hat Costs")

第二年帽子价格数据(建议统一列名为Dollars)

Hat     Dollars
----------------------
0    Blue          35  # 示例涨价2美元
1   Green          40  # 示例降价2美元
2     Red          58  # 示例涨价4美元

注:原数据第二年列名为Dollar,统一为Dollars可避免后续匹配出错。

需求

在第一年条形图基础上,将第二年价格以同一条形的延伸段展示(涨跌均可),延伸段用同色淡色或斜线填充区分。

修改方案与完整代码

核心思路:先绘制第一年的基础条形,再根据两年价格差值,在对应位置叠加延伸段,通过颜色透明度或填充图案区分新旧价格。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.patches import Rectangle

# 模拟两年数据
df_year1 = pd.DataFrame({
    'Hat': ['Blue', 'Green', 'Red'],
    'Dollars': [33, 42, 54]
})
df_year2 = pd.DataFrame({
    'Hat': ['Blue', 'Green', 'Red'],
    'Dollars': [35, 40, 58]
})

# 合并两年数据,匹配每个帽子的价格
merged_df = df_year1.merge(df_year2, on='Hat', suffixes=('_year1', '_year2'))

# 绘制第一年基础条形图
plt.figure(figsize=(8,6))
ax = sns.barplot(x='Hat', y='Dollars_year1', data=merged_df, hue='Hat')

# 保留原有样式设置
ax.set_xticklabels([])
ax.set_ylabel("Dollars", fontsize=15)
ax.set_xlabel("Hat", fontsize=0)
ax.legend(title="Hat Costs")

# 获取每个条形的位置、宽度和对应颜色
bars = ax.patches
hat_color_map = {bar.get_label(): bar.get_facecolor() for bar in bars}

# 遍历绘制价格延伸段
for idx, row in merged_df.iterrows():
    hat_name = row['Hat']
    price_year1 = row['Dollars_year1']
    price_year2 = row['Dollars_year2']
    current_bar = bars[idx]
    bar_x = current_bar.get_x()
    bar_width = current_bar.get_width()
    
    # 判断涨跌,确定延伸段的起始位置和高度
    price_diff = price_year2 - price_year1
    if price_diff > 0:
        # 涨价:从第一年价格顶部向上延伸
        extend_y_start = price_year1
        extend_height = price_diff
    else:
        # 降价:从第二年价格向上延伸(覆盖到第一年价格位置)
        extend_y_start = price_year2
        extend_height = abs(price_diff)
    
    # 创建延伸段矩形:可选淡色填充/斜线填充
    # 方式1:淡色填充(降低透明度)
    extend_rect = Rectangle((bar_x, extend_y_start), bar_width, extend_height,
                           facecolor=hat_color_map[hat_name], alpha=0.4)
    # 方式2:淡色+斜线填充
    # extend_rect = Rectangle((bar_x, extend_y_start), bar_width, extend_height,
    #                        facecolor=hat_color_map[hat_name], alpha=0.4, hatch='///')
    
    ax.add_patch(extend_rect)

plt.tight_layout()
plt.show()

代码说明

  1. 合并两年数据,确保每个帽子的两年价格一一对应;
  2. 先绘制第一年的基础条形,保留原有样式设置;
  3. 通过ax.patches提取每个条形的位置、宽度和颜色,用于延伸段的样式匹配;
  4. 遍历每个帽子,根据价格涨跌判断延伸段的绘制方向:涨价则向上延伸,降价则从低价处向上覆盖到原价格;
  5. 延伸段使用原条形颜色的淡色(alpha=0.4降低透明度),也可添加hatch='///'参数实现斜线填充效果;
  6. 最后调整布局并展示图形。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:40:56