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

如何用Matplotlib在单图中展示股票交易全量数据?

单图展示所有股票交易字段的Matplotlib方案

核心思路

将股票名称+日期作为复合x轴标签,用分组条形图区分不同操作类型(Action)的交易量(Quantity),同时用副轴展示交易占比(Traded %),实现单图呈现所有字段信息。

实现代码

import matplotlib.pyplot as plt
import pandas as pd

# 预处理日期字段,转为可读字符串
df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')
# 生成复合x轴标签:股票名称+日期
df['Stock_Date'] = df['Stock'] + '\n' + df['Date']

# 初始化画布和主轴
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots(figsize=(18, 10))

# 按操作类型分组绘制交易量条形图
action_types = df['Action'].unique()
bar_width = 0.25
x_base = range(len(df['Stock_Date'].unique()))

for idx, action in enumerate(action_types):
    subset = df[df['Action'] == action]
    ax.bar([pos + idx*bar_width for pos in x_base],
           subset['Quantity'],
           width=bar_width,
           label=f'操作类型: {action}')

# 绘制交易占比副轴
ax2 = ax.twinx()
# 让折线点对齐每组条形的中间位置
ax2.plot([pos + bar_width*(len(action_types)-1)/2 for pos in x_base],
         df['Traded %'],
         color='black',
         marker='o',
         linestyle='--',
         label='交易占比')

# 设置轴标签与标题
ax.set_xlabel('股票名称+日期', fontsize=14)
ax.set_ylabel('交易量', fontsize=14, color='olivedrab')
ax2.set_ylabel('交易占比(%)', fontsize=14, color='black')
ax.set_title('股票交易详情:交易量、操作类型、日期及交易占比', fontsize=16)

# 配置x轴刻度与标签
ax.set_xticks([pos + bar_width*(len(action_types)-1)/2 for pos in x_base])
ax.set_xticklabels(df['Stock_Date'].unique(), fontsize=12, rotation=45)

# 合并双轴图例
lines1, labels1 = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

# 调整布局防止标签截断
plt.tight_layout()
plt.show()

代码说明

  • 复合x轴标签:通过拼接股票名称和日期,让x轴同时展示两个关键字段。
  • 分组条形区分操作类型:针对不同操作类型设置不同条形位置,清晰区分同一只股票在同一日期的不同操作。
  • 副轴对齐优化:让交易占比的折线点对齐每组条形的中间,提升视觉协调性。
  • 样式调整:通过调整标签大小、旋转角度和布局,避免内容重叠,增强可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:05:26