python-3.x - 如何使用 matplotlib.pyplot 在条形图和数据表之间创建空间?
问题描述
我一直在寻找如何使用 matplotlib.pyplot 在条形图和表格之间添加空间的几个小时,但我还没有找到关于如何正确显示布局的解决方案。目前表格顶部与条形图 x 轴标题相冲突,表格底部超出图形。figsize
我尝试使用bbox
,使数字变大subplots_adjust
,plt.tight_layout()
但没有任何效果。任何帮助表示赞赏。
def plot_bar(df, *args):
df = pd.DataFrame([{'OPEN': 4, 'CLOSED': 139, 'DATE': '2019-01-01'}, {'OPEN': 0, 'CLOSED': 139, 'DATE': '2019-02-01'}, {'OPEN': 1, 'CLOSED': 124, 'DATE': '2019-03-01'}, {'OPEN': 4, 'CLOSED': 127, 'DATE': '2019-04-01'}, {'OPEN': 1, 'CLOSED': 84, 'DATE': '2019-05-01'}, {'OPEN': 6, 'CLOSED': 113, 'DATE': '2019-06-01'}, {'OPEN': 0, 'CLOSED': 123, 'DATE': '2019-07-01'}, {'OPEN': 2, 'CLOSED': 109, 'DATE': '2019-08-01'}, {'OPEN': 0, 'CLOSED': 107, 'DATE': '2019-09-01'}, {'OPEN': 7, 'CLOSED': 119, 'DATE': '2019-10-01'}, {'OPEN': 2, 'CLOSED': 82, 'DATE': '2019-11-01'}, {'OPEN': 4, 'CLOSED': 83, 'DATE': '2019-12-01'}, {'OPEN': 12, 'CLOSED': 112, 'DATE': '2020-01-01'}, {'OPEN': 10, 'CLOSED': 89, 'DATE': '2020-02-01'}, {'OPEN': 31, 'CLOSED': 64, 'DATE': '2020-03-01'}])
df["DATE"] = pd.to_datetime(df["DATE"])
df['DATE'] = df['DATE'].apply(lambda x: [x.month, x.year])
df['DATE'] = df['DATE'].apply(lambda x: f'{calendar.month_abbr[x[0]]}-{x[1]}')
ax = df.plot.bar(x=args[0]['x'], y=args[0]['y'], figsize=(15, 7))
for i, v in enumerate(df['OPEN']):
ax.text(i - .20, v + 1, str(v), color='blue', fontweight='bold')
for i, v in enumerate(df['CLOSED']):
ax.text(i - .20, v + 1, str(v), color='orange', fontweight='bold')
plt.title('Open vs Closed Tickets')
plt.xlabel('Time')
plt.ylabel('Tickets')
table_columns = df['DATE'].values.tolist()
open = df['OPEN'].values.tolist()
closed = df['CLOSED'].values.tolist()
table_data = [open, closed]
table_rows = df.columns.values.tolist()[0:2]
plt.table(cellText=table_data, rowLabels=table_rows, colLabels=table_columns, loc='bottom',
bbox=[0, -0.250, 1, 0.2])
plt.tight_layout()
plt.show()
return
回答 Diziet Asahi:我进行了这 2 项更改,但不知何故我的桌子仍然被切成两半,这太令人沮丧了。
解决方案
一个可能的问题是您必须使用after(否则,tight_layout 将撤消您对 subplots_adjust 所做的操作)。这将改变绘图的大小并为下表腾出更多空间。增加值以满足您的需要,该值以图形的分数给出,因此将图的底部定位在图形高度的 20% 处。plt.subplots_adjust(bottom=xxx)
tight_layout()
xxx
bottom=0.2
另一个问题是您正在使用plt.table()
它来让桌子“粘”在轴上。如果将表格放在轴下方,则基本上应该替换 x 轴标签。但是您必须在使用loc=
(自动放置)或bbox=
(手动放置)之间进行选择。您不能同时使用两者。
这是做这两件事的结果:
import calendar
df = pd.DataFrame([{'OPEN': 4, 'CLOSED': 139, 'DATE': '2019-01-01'}, {'OPEN': 0, 'CLOSED': 139, 'DATE': '2019-02-01'}, {'OPEN': 1, 'CLOSED': 124, 'DATE': '2019-03-01'}, {'OPEN': 4, 'CLOSED': 127, 'DATE': '2019-04-01'}, {'OPEN': 1, 'CLOSED': 84, 'DATE': '2019-05-01'}, {'OPEN': 6, 'CLOSED': 113, 'DATE': '2019-06-01'}, {'OPEN': 0, 'CLOSED': 123, 'DATE': '2019-07-01'}, {'OPEN': 2, 'CLOSED': 109, 'DATE': '2019-08-01'}, {'OPEN': 0, 'CLOSED': 107, 'DATE': '2019-09-01'}, {'OPEN': 7, 'CLOSED': 119, 'DATE': '2019-10-01'}, {'OPEN': 2, 'CLOSED': 82, 'DATE': '2019-11-01'}, {'OPEN': 4, 'CLOSED': 83, 'DATE': '2019-12-01'}, {'OPEN': 12, 'CLOSED': 112, 'DATE': '2020-01-01'}, {'OPEN': 10, 'CLOSED': 89, 'DATE': '2020-02-01'}, {'OPEN': 31, 'CLOSED': 64, 'DATE': '2020-03-01'}])
df["DATE"] = pd.to_datetime(df["DATE"])
df['DATE'] = df['DATE'].apply(lambda x: [x.month, x.year])
df['DATE'] = df['DATE'].apply(lambda x: f'{calendar.month_abbr[x[0]]}-{x[1]}')
ax = df.plot.bar(x='DATE', y=['OPEN','CLOSED'], figsize=(15, 7))
for i, v in enumerate(df['OPEN']):
ax.text(i - .20, v + 1, str(v), color='blue', fontweight='bold')
for i, v in enumerate(df['CLOSED']):
ax.text(i - .20, v + 1, str(v), color='orange', fontweight='bold')
plt.title('Open vs Closed Tickets')
plt.ylabel('Tickets')
#remove all x-labels since the table will be used instead
plt.xlabel('')
plt.xticks([])
table_columns = df['DATE'].values.tolist()
open = df['OPEN'].values.tolist()
closed = df['CLOSED'].values.tolist()
table_data = [open, closed]
table_rows = df.columns.values.tolist()[0:2]
plt.table(cellText=table_data, rowLabels=table_rows, colLabels=table_columns, loc='bottom')
plt.tight_layout()
plt.subplots_adjust(bottom=0.1)
plt.show()
推荐阅读
- c# - 由于 Android 上的权限问题,我的应用程序正在终止
- xml - XQUERY:优化涉及大型集合的查询
- git - 在 Jenkins 中创建拉取请求
- javascript - TypeError:无法设置未定义的属性“_eventListeners”
- c# - c# 使用没有 BindingSource 的高级 datagridview (ADGV) 过滤器
- python - 导入 URL 数据属于一个索引 - Python
- sql - 在同一个程序中使用 excel 和 sql 数据库进行咨询
- regex - Netscape Navigator 9 中的正则表达式
- javascript - React.js map() 不是函数吗?
- java - 链表内的通用链表?