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

求助:如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:15:10