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

如何基于税务DataFrame实现指定堆叠柱状图?

程序

以下是通过treasury.gov API获取税务数据的Python程序:

import pandas as pd
import treasury_gov_pandas
# ----------------------------------------------------------------------
df = treasury_gov_pandas.update_records(
    url = 'https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v1/accounting/dts/deposits_withdrawals_operating_cash')

df['record_date'] = pd.to_datetime(df['record_date'])

df['transaction_today_amt'] = pd.to_numeric(df['transaction_today_amt'])

tmp = df[(df['transaction_type'] == 'Deposits') &   ((df['transaction_catg'].str.contains('Tax'))   |   (df['transaction_catg'].str.contains('FTD')))   ]

该程序使用自定义库下载数据。

DataFrame

处理后的数据如下所示:

>>> tmp.tail(20).drop(columns=['table_nbr', 'table_nm', 'src_line_nbr', 'record_fiscal_year', 'record_fiscal_quarter', 'record_calendar_year', 'record_calendar_quarter', 'record_calendar_month', 'record_calendar_day', 'transaction_mtd_amt', 'transaction_fytd_amt', 'transaction_catg_desc', 'account_type', 'transaction_type'])

       record_date                          transaction_catg  transaction_today_amt
371266  2024-04-03    DHS - Customs and Certain Excise Taxes                     84
371288  2024-04-03                  Taxes - Corporate Income                    237
371289  2024-04-03                   Taxes - Estate and Gift                     66
371290  2024-04-03       Taxes - Federal Unemployment (FUTA)                     10
371291  2024-04-03  Taxes - IRS Collected Estate, Gift, misc                     23
371292  2024-04-03              Taxes - Miscellaneous Excise                     41
371293  2024-04-03  Taxes - Non Withheld Ind/SECA Electronic                   1786
371294  2024-04-03       Taxes - Non Withheld Ind/SECA Other                   2315
371295  2024-04-03               Taxes - Railroad Retirement                      3
371296  2024-04-03          Taxes - Withheld Individual/FICA                  12499
371447  2024-04-04    DHS - Customs and Certain Excise Taxes                     82
371469  2024-04-04                  Taxes - Corporate Income                    288
371470  2024-04-04                   Taxes - Estate and Gift                     59
371471  2024-04-04       Taxes - Federal Unemployment (FUTA)                      8
371472  2024-04-04  Taxes - IRS Collected Estate, Gift, misc                    127
371473  2024-04-04              Taxes - Miscellaneous Excise                     17
371474  2024-04-04  Taxes - Non Withheld Ind/SECA Electronic                   1905
371475  2024-04-04       Taxes - Non Withheld Ind/SECA Other                   1092
371476  2024-04-04               Taxes - Railroad Retirement                      1
371477  2024-04-04          Taxes - Withheld Individual/FICA                   2871

该DataFrame的数据可追溯至2005年:

>>> tmp.drop(columns=['table_nbr', 'table_nm', 'src_line_nbr', 'record_fiscal_year', 'record_fiscal_quarter', 'record_calendar_year', 'record_calendar_quarter', 'record_calendar_month', 'record_calendar_day', 'transaction_mtd_amt', 'transaction_fytd_amt', 'transaction_catg_desc', 'account_type', 'transaction_type'])

       record_date                                   transaction_catg  transaction_today_amt
2       2005-10-03                   Customs and Certain Excise Taxes                    127
7       2005-10-03                              Estate and Gift Taxes                     74
10      2005-10-03                          FTD's Received (Table IV)                   2515
12      2005-10-03  Individual Income and Employment Taxes, Not Wi...                    353
21      2005-10-03                          FTD's Received (Table IV)                  15708
...            ...                                                ...                    ...
371473  2024-04-04                       Taxes - Miscellaneous Excise                     17
371474  2024-04-04           Taxes - Non Withheld Ind/SECA Electronic                   1905
371475  2024-04-04                Taxes - Non Withheld Ind/SECA Other                   1092
371476  2024-04-04                        Taxes - Railroad Retirement                      1
371477  2024-04-04                   Taxes - Withheld Individual/FICA                   2871
问询

我需要将该数据绘制成堆叠柱状图,具体要求如下:

  • x轴为record_date
  • y轴为transaction_today_amt
  • 以transaction_catg作为堆叠项

可使用任意绘图库(如matplotlib、bokeh、plotly等),请问有什么合适的实现方式?


实现方案

方案1:Matplotlib + Pandas(快速生成静态图)

利用Pandas对Matplotlib的内置支持,几步就能生成堆叠柱状图:

import matplotlib.pyplot as plt

# 透视数据:按日期和税务类别聚合金额,确保同一日期同一类别仅一条数据
pivot_df = tmp.pivot_table(
    index='record_date',
    columns='transaction_catg',
    values='transaction_today_amt',
    aggfunc='sum',
    fill_value=0
)

# 绘制堆叠柱状图
plt.figure(figsize=(12, 6))
pivot_df.plot(kind='bar', stacked=True, ax=plt.gca())

# 美化图表
plt.title('每日税务存款堆叠柱状图')
plt.xlabel('日期')
plt.ylabel('当日交易金额')
plt.legend(title='税务类别', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()

方案2:Plotly(交互式图表,适合大数据量)

Plotly生成的图表支持缩放、悬停查看详情,适合查看长期数据:

import plotly.express as px

# 透视数据并转为长格式适配Plotly
pivot_df = tmp.pivot_table(
    index='record_date',
    columns='transaction_catg',
    values='transaction_today_amt',
    aggfunc='sum',
    fill_value=0
).reset_index()
long_df = pivot_df.melt(id_vars='record_date', var_name='transaction_catg', value_name='transaction_today_amt')

# 绘制堆叠柱状图
fig = px.bar(
    long_df,
    x='record_date',
    y='transaction_today_amt',
    color='transaction_catg',
    title='每日税务存款堆叠柱状图',
    labels={'transaction_today_amt': '当日交易金额', 'record_date': '日期'},
    barmode='stack'
)

fig.update_layout(legend_title='税务类别')
fig.show()

方案3:Bokeh(交互式Web图表,适合嵌入网页)

如果需要将图表嵌入网页展示,Bokeh是合适的选择:

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.palettes import Category20
import numpy as np

# 透视数据并准备绘图数据
pivot_df = tmp.pivot_table(
    index='record_date',
    columns='transaction_catg',
    values='transaction_today_amt',
    aggfunc='sum',
    fill_value=0
).reset_index()
categories = pivot_df.columns[1:]
colors = Category20[len(categories)]
dates = pivot_df['record_date']

# 创建数据源
source = ColumnDataSource(pivot_df)

# 绘制堆叠柱形
p = figure(x_range=dates, title='每日税务存款堆叠柱状图', x_axis_label='日期', y_axis_label='当日交易金额', width=1000, height=600)
bottom = np.zeros(len(dates))
for cat, color in zip(categories, colors):
    p.vbar(
        x='record_date',
        top=cat,
        bottom=bottom,
        width=0.8,
        color=color,
        legend_label=cat,
        source=source
    )
    bottom += pivot_df[cat].values

# 添加悬停工具和图例交互
hover = HoverTool(tooltips=[('日期', '@record_date'), ('金额', '@$name')])
p.add_tools(hover)
p.legend.location = 'top_right'
p.legend.click_policy = 'hide'  # 点击图例可隐藏对应类别

show(p)

关键优化建议

由于数据跨度从2005到2024年,直接绘制所有日期会导致x轴标签重叠,建议:

  1. 按时间粒度聚合:比如按周/月计算各类别总和,减少数据点数量
# 示例:按月份聚合数据
tmp['month'] = tmp['record_date'].dt.to_period('M')
monthly_df = tmp.groupby(['month', 'transaction_catg'])['transaction_today_amt'].sum().reset_index()

# 绘制月度堆叠图
fig = px.bar(
    monthly_df,
    x='month',
    y='transaction_today_amt',
    color='transaction_catg',
    title='月度税务存款堆叠柱状图',
    labels={'transaction_today_amt': '月度交易金额', 'month': '月份'},
    barmode='stack'
)
fig.show()
  1. 筛选时间范围:只绘制最近1-2年的数据,聚焦重点时段
  2. 使用交互式缩放:借助Plotly/Bokeh的缩放功能查看细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:08:14