如何解决条形图 x 轴过度拥挤的问题

How to resolve issues with a bar plot x-axis being overcrowded

提问人:dharmatech 提问时间:10/26/2023 最后编辑:Trenton McKinneydharmatech 更新时间:10/26/2023 访问量:71

问:

下面是一个执行以下操作的 Python 程序:

  • 对 treasury.gov 进行 API 调用以检索数据
  • 将数据存储在 Pandas 数据帧中
  • 将数据绘制为条形图
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'])

# Convert transaction_today_amt to numeric
df['transaction_today_amt'] = pd.to_numeric(df['transaction_today_amt']) 

df.plot.bar(x='record_date', y='transaction_today_amt')

plt.show()

这是我得到的结果图表:

enter image description here

如您所见,x 轴标签太多。

问题

设置图表以使 x 轴标签清晰易读的好方法是什么?

Python Pandas Matplotlib 时间序列 条形图

评论


答:

1赞 Trenton McKinney 10/26/2023 #1
  • 这些值是字符串,而不是日期时间。'record_date'
    • df.record_date = pd.to_datetime(df.record_date)
  • 通常,对于连续时间序列数据,应使用折线图。

线图

ax = df.plot(x='record_date', y='transaction_today_amt', figsize=(12, 7))

enter image description here

散布图

ax = df.plot(kind='scatter', x='record_date', y='transaction_today_amt', marker='.', figsize=(12, 7))

enter image description here

酒吧图

  • 直接使用 ,因为 xtick 是日期时间序号,它将用 Year 标记 x 轴。
    • ax.get_xticks()array([12418., 13149., 13879., 14610., 15340., 16071., 16801., 17532., 18262., 18993., 19723.])
fig, ax = plt.subplots(figsize=(8, 5), dpi=200)

ax.bar(x='record_date', height='transaction_today_amt', data=df)
ax.set_yscale('log')

enter image description here

  • 将 Xtick 视为离散的,并绘制了所有 Xtick。
ax = df.plot(kind='bar', x='record_date', y='transaction_today_amt', figsize=(12, 7))

enter image description here

评论

1赞 Trenton McKinney 10/26/2023
@dharmatech 3916 我们在 4538 条记录中是 <=10。它们可以用 过滤掉。df = df[df.transaction_today_amt.gt(10)]
1赞 dharmatech 10/26/2023
好建议。👍 这样可以更快地创建图表。
0赞 dharmatech 10/26/2023
我在这里发布了一个关于分组的相关问题:stackoverflow.com/questions/77363957/......