如何用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()
代码说明
- 合并两年数据,确保每个帽子的两年价格一一对应;
- 先绘制第一年的基础条形,保留原有样式设置;
- 通过
ax.patches提取每个条形的位置、宽度和颜色,用于延伸段的样式匹配; - 遍历每个帽子,根据价格涨跌判断延伸段的绘制方向:涨价则向上延伸,降价则从低价处向上覆盖到原价格;
- 延伸段使用原条形颜色的淡色(
alpha=0.4降低透明度),也可添加hatch='///'参数实现斜线填充效果; - 最后调整布局并展示图形。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

