求助:如何用Python实现带方向箭头的价格-成交量自定义图表
Python实现带方向箭头的价格-成交量整合图表
适用工具
- Pandas:负责清洗、整合每日价格与成交量数据,计算价格涨跌方向
- Matplotlib:适合生成静态可嵌入的图表,对子图布局和箭头元素支持完善
- Plotly:主打交互式可视化,方便查看细节,箭头配置更灵活
Matplotlib静态图表实现步骤
1. 数据处理
先加载并预处理数据,计算每日价格的涨跌方向:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.patches import Arrow # 替换为你的真实数据(可通过pd.read_excel/pd.read_csv读取) data = { '日期': pd.date_range(start='2024-01-01', periods=10), '价格': [15.2, 15.5, 15.3, 15.7, 15.6, 16.0, 15.8, 16.2, 16.1, 16.5], '成交量': [20000, 25000, 18000, 30000, 22000, 35000, 28000, 40000, 32000, 45000] } df = pd.DataFrame(data) df.set_index('日期', inplace=True) # 标记涨跌方向:1=涨,-1=跌,0=平盘 df['涨跌方向'] = df['价格'].diff().apply(lambda x: 1 if x>0 else (-1 if x<0 else 0))
2. 绘制子图与箭头
创建上下布局的子图(价格在上、成交量在下),并添加涨跌箭头:
# 创建共享X轴的双生子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True, gridspec_kw={'height_ratios': [3, 1]}) # 绘制价格折线 ax1.plot(df.index, df['价格'], color='navy', linewidth=2) # 遍历添加涨跌箭头 for idx, row in df.iterrows(): if row['涨跌方向'] == 1: # 向上箭头,位置微调避免遮挡价格线 ax1.add_patch(Arrow(idx, row['价格']-0.1, 0, 0.2, width=0.2, color='green')) elif row['涨跌方向'] == -1: # 向下箭头 ax1.add_patch(Arrow(idx, row['价格']+0.1, 0, -0.2, width=0.2, color='red')) # 配置价格子图样式 ax1.set_ylabel('价格', fontsize=12) ax1.grid(axis='y', linestyle='--', alpha=0.7) ax1.set_title('每日价格与成交量(带涨跌箭头)', fontsize=14) # 绘制成交量柱状图 ax2.bar(df.index, df['成交量'], color='gray', alpha=0.6) ax2.set_xlabel('日期', fontsize=12) ax2.set_ylabel('成交量', fontsize=12) ax2.grid(axis='y', linestyle='--', alpha=0.7) # 自动调整布局 plt.tight_layout() # 保存图表(可选) # plt.savefig('price_volume_chart.png', dpi=300) plt.show()
Plotly交互式图表实现
如果需要hover查看详细数据、缩放交互,用Plotly更合适:
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 复用之前处理好的df数据 fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1, row_heights=[0.7, 0.3], subplot_titles=('每日价格', '成交量')) # 添加价格折线 fig.add_trace(go.Scatter(x=df.index, y=df['价格'], mode='lines', name='价格', line=dict(color='navy')), row=1, col=1) # 筛选涨跌数据,添加箭头标记 up_data = df[df['涨跌方向'] == 1] down_data = df[df['涨跌方向'] == -1] fig.add_trace(go.Scatter(x=up_data.index, y=up_data['价格']-0.1, mode='markers', marker=dict(symbol='triangle-up', color='green', size=10), name='上涨'), row=1, col=1) fig.add_trace(go.Scatter(x=down_data.index, y=down_data['价格']+0.1, mode='markers', marker=dict(symbol='triangle-down', color='red', size=10), name='下跌'), row=1, col=1) # 添加成交量柱状图 fig.add_trace(go.Bar(x=df.index, y=df['成交量'], name='成交量', marker_color='gray'), row=2, col=1) # 配置布局 fig.update_layout(height=600, width=1000, title_text='每日价格与成交量(交互式)') fig.update_yaxes(title_text='价格', row=1, col=1) fig.update_yaxes(title_text='成交量', row=2, col=1) fig.update_xaxes(title_text='日期', row=2, col=1) fig.show()
注意事项
- 箭头的大小、位置可根据实际价格波动范围调整,避免遮挡数据
- 静态图表可通过
plt.savefig()保存为图片,交互式图表可导出为HTML或图片 - 批量处理每日新增数据时,可将数据读取逻辑封装为函数,自动计算涨跌方向并更新图表
内容的提问来源于stack exchange,提问作者Vishal Shaw
相关产品推荐
相关产品推荐

