如何解决Python绘制柱状图时X轴标签过于拥挤的问题?
解决Matplotlib柱状图X轴日期标签密集的方案
针对你代码里X轴日期标签挤在一起的问题,这里有几个实用的解决办法:
1. 旋转X轴标签
把标签旋转一定角度并设置右对齐,既能保留全部日期信息,又能避免重叠:
import requests import pandas as pd import matplotlib.pyplot as plt date = '1900-01-01' transaction_type = 'Withdrawals' transaction_catg = 'Interest on Treasury Securities' page_size = 10000 url = 'https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v1/accounting/dts/deposits_withdrawals_operating_cash' url_params = f'?filter=record_date:gt:{date},transaction_type:eq:{transaction_type},transaction_catg:eq:{transaction_catg}&page[size]={page_size}' response = requests.get(url + url_params) result_json = response.json() df = pd.DataFrame(result_json['data']) df['transaction_today_amt'] = pd.to_numeric(df['transaction_today_amt']) df.plot.bar(x='record_date', y='transaction_today_amt') # 核心修改:旋转标签并右对齐,同时调整底部间距防止截断 plt.xticks(rotation=45, ha='right') plt.subplots_adjust(bottom=0.25) plt.show()
2. 采样显示标签
如果数据量极大,没必要显示每个日期的标签,只保留部分关键日期即可:
# 前面代码与上述一致,到绘图部分: df.plot.bar(x='record_date', y='transaction_today_amt') # 每隔100个日期显示一个标签(可根据数据量调整间隔) ticks = plt.xticks()[0] labels = df['record_date'].tolist() plt.xticks(ticks=ticks[::100], labels=labels[::100], rotation=45, ha='right') plt.subplots_adjust(bottom=0.25) plt.show()
3. 按时间维度聚合数据
直接减少数据点数量是最根本的解决办法,比如按月份/季度聚合金额,大幅减少X轴标签数量:
import requests import pandas as pd import matplotlib.pyplot as plt date = '1900-01-01' transaction_type = 'Withdrawals' transaction_catg = 'Interest on Treasury Securities' page_size = 10000 url = 'https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v1/accounting/dts/deposits_withdrawals_operating_cash' url_params = f'?filter=record_date:gt:{date},transaction_type:eq:{transaction_type},transaction_catg:eq:{transaction_catg}&page[size]={page_size}' response = requests.get(url + url_params) result_json = response.json() df = pd.DataFrame(result_json['data']) df['transaction_today_amt'] = pd.to_numeric(df['transaction_today_amt']) # 核心修改:转换日期格式并按月份聚合求和('W'=周,'Q'=季度) df['record_date'] = pd.to_datetime(df['record_date']) df.set_index('record_date', inplace=True) monthly_df = df.resample('M')['transaction_today_amt'].sum() monthly_df.plot.bar() plt.xticks(rotation=45, ha='right') plt.subplots_adjust(bottom=0.25) plt.show()
4. 使用简化的日期格式
把完整的YYYY-MM-DD格式改成更短的形式,缩短标签长度:
# 前面代码一致,到处理日期部分: df['record_date'] = pd.to_datetime(df['record_date']) # 生成简化日期标签(比如只保留年月) df['short_date'] = df['record_date'].dt.strftime('%Y-%m') df.plot.bar(x='short_date', y='transaction_today_amt') plt.xticks(rotation=45, ha='right') plt.subplots_adjust(bottom=0.25) plt.show()
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

