如何使用Plotly绘制带事件标注的枕头价格-日期折线图
Plotly 绘制带事件标注的枕头价格折线图方案
原有代码问题说明
fig.update_layout()语句缺失右括号,会直接触发语法报错- 直接转置DataFrame时没有处理列名、字段类型,会导致坐标轴映射异常
- 缺失事件标注的对应逻辑,无法展示日期对应的事件信息
完整实现步骤
1. 数据预处理
先把原始宽表整理为绘图用的标准长表结构,拆分价格字段和事件字段:
import pandas as pd import plotly.express as px # 将指标列设为索引 df = df.set_index('Metrics(指标)') # 提取枕头价格、事件两行数据,转置后重置索引 plot_data = df.loc[['The price of pillows(枕头价格)', 'Events(事件)']].T.reset_index() # 重命名列 plot_data.columns = ['Date', 'PillowPrice', 'Event'] # 转换价格列为数值类型,过滤空值 plot_data['PillowPrice'] = pd.to_numeric(plot_data['PillowPrice'], errors='coerce') # 提取所有存在有效事件的日期点,用于后续标注 event_points = plot_data[plot_data['Event'].notna()]
2. 绘制基础折线图
修正原有语法问题,先绘制价格趋势线:
fig = px.line( plot_data.dropna(subset=['PillowPrice']), x='Date', y='PillowPrice', width=900, height=800, markers=True, # 显示数据点标记,方便对应事件位置 line=dict(color='#1f77b4', width=2) ) fig.update_layout( title="The price of pillows trend", xaxis_title="Date", yaxis_title="Price", title_x=0.5 # 标题居中 )
3. 添加事件标注
遍历所有事件点,为每个点添加带箭头的文本标注,调整标注位置避免遮挡折线:
for _, row in event_points.iterrows(): # 获取当前事件日期对应的价格,确定标注锚点 anchor_price = plot_data[plot_data['Date'] == row['Date']]['PillowPrice'].iloc[0] fig.add_annotation( x=row['Date'], y=anchor_price, text=row['Event'], showarrow=True, arrowhead=2, yshift=25, # 标注向上偏移25像素,可根据显示效果调整 bgcolor='white', bordercolor='#333', borderwidth=1, font=dict(size=10) ) fig.show()
运行代码后即可得到符合要求的折线图:价格趋势清晰,每个有事件的日期点会通过箭头指向对应位置,标注事件内容,和参考示例效果一致。
内容的提问来源于stack exchange,提问作者Anna Shevtsova
相关产品推荐
相关产品推荐

