2. 绘制股票成交量柱状图

任务说明

本案例使用Python的Matplotlib库,基于pandas读取的股票日线数据,绘制成交量柱状图。输入数据包含日期和成交量两列,输出为一张以日期为横轴、成交量为纵轴的柱状图,柱体颜色根据当日收盘价相对于前一日收盘价的涨跌分别显示为红色(上涨)或绿色(下跌),并在图表顶部标注成交量数值。

实现代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np

# 准备示例数据(真实场景中可通过 tushare / yfinance 等获取)
data = {
    'date': pd.date_range('2024-01-02', periods=10, freq='B'),
    'volume': [152300, 189200, 134500, 210800, 176400, 198700, 145600, 223900, 167300, 190200],
    'close': [10.5, 10.8, 10.6, 11.2, 11.0, 11.5, 11.3, 11.8, 11.6, 12.1]
}
df = pd.DataFrame(data)

# 计算涨跌:当日收盘价 ≥ 前一日收盘价视为上涨(红色),否则下跌(绿色)
df['change'] = df['close'].diff()
df['color'] = np.where(df['change'] >= 0, '#d32f2f', '#2e7d32')
# 首日无前日比较,默认视为上涨
df.loc[0, 'color'] = '#d32f2f'

# 创建图表
fig, ax = plt.subplots(figsize=(10, 5))

# 绘制柱状图
bars = ax.bar(df['date'], df['volume'], color=df['color'], width=0.6)

# 设置标题与坐标轴标签
ax.set_title('股票每日成交量柱状图', fontsize=14)
ax.set_xlabel('日期')
ax.set_ylabel('成交量(手)')

# 格式化横轴日期显示
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
fig.autofmt_xdate(rotation=45)

# 在柱体顶部标注成交量数值
for bar, vol in zip(bars, df['volume']):
    ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 3000,
            f'{vol:,}', ha='center', va='bottom', fontsize=8)

# 调整纵轴范围,为标注留出空间
ax.set_ylim(0, df['volume'].max() * 1.15)

plt.tight_layout()
plt.show()

代码说明

代码首先构造了包含10个交易日日期、成交量和收盘价的DataFrame作为演示输入。通过diff()计算收盘价日间变化,使用np.where将非负变化映射为红色(#d32f2f),负变化映射为绿色(#2e7d32),首日因无前值比较默认设为红色。随后调用ax.bar()绘制柱状图,并通过ax.text()在每个柱体顶部添加格式化后的成交量数值。横轴日期格式通过mdates.DateFormatter控制,autofmt_xdate()自动旋转日期标签避免重叠。

运行与验证

运行环境需安装pandas、matplotlib和numpy。执行代码后,将弹出一个窗口显示柱状图。验证要点:

  • 横轴显示10个日期刻度,标签完整且不重叠;
  • 柱体高度与volume列数值成比例,柱顶标注数值与柱高对应;
  • 第2、4、6、8、10根柱(对应收盘价较前日上涨)为红色,第3、5、7、9根柱(收盘价较前日下跌)为绿色,第1根柱为红色。

若需处理真实股票数据,将df替换为包含date、volume、close三列的实际DataFrame即可,其余代码无需改动。

成交量柱状图结构示意 0 10万 20万 152,300 189,200 134,500 210,800 176,400 198,700 145,600 223,900 167,300 190,200 01-02 01-03 01-04 01-05 01-08 01-09 01-10 01-11 01-12 01-15 上涨 下跌 柱顶数值 = 当日成交量(手) 颜色 = 收盘价较前日涨跌