如何基于税务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轴标签重叠,建议:
- 按时间粒度聚合:比如按周/月计算各类别总和,减少数据点数量
# 示例:按月份聚合数据 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-2年的数据,聚焦重点时段
- 使用交互式缩放:借助Plotly/Bokeh的缩放功能查看细节
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

