[英]stacked bar chart - space between y-axis and first bar: matplotlib.pyplot
[英]How to create space between bar chart and data table using 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 個更改,但不知何故我的桌子仍然被切成兩半,這太令人沮喪了。
一個可能的問題是您必須在plt.subplots_adjust(bottom=xxx)
之后使用plt.subplots_adjust(bottom=xxx)
tight_layout()
(否則tight_layout 將撤消您對 subplots_adjust 所做的操作)。 這將改變繪圖的大小並為下表騰出更多空間。 增加xxx
值以滿足您的需要,該值以圖形的分數給出,因此bottom=0.2
會將圖的bottom=0.2
定位在圖形高度的 20% 處。
另一個問題是您使用的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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.