Как создать пространство между гистограммой и таблицей данных, используя matplotlib.pyplot? - PullRequest
0 голосов
/ 23 марта 2020

Я часами искал, как добавить пространство между гистограммой и таблицей, используя matplotlib.pyplot, но я не нашел решения о том, как правильно отобразить макет. В настоящее время верхняя часть таблицы сталкивается с заголовком оси х столбчатой ​​диаграммы, а нижняя часть таблицы находится вне фигуры. Я пытался увеличить число с помощью figsize, я пытался использовать bbox, subplots_adjust, plt.tight_layout(), но ни один не работает. Любая помощь приветствуется.

enter image description here

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

Ответ Дизиет Асахи: я внес эти 2 изменения, но мой стол все равно как-то пополам, это так расстраивает.

enter image description here

1 Ответ

0 голосов
/ 23 марта 2020

Одной из возможных проблем является то, что вам нужно использовать plt.subplots_adjust(bottom=xxx) после tight_layout() (в противном случаелоток_проверка отменит то, что вы сделали с subplots_adjust). Это изменит размер сюжета и освободит больше места для таблицы ниже. Увеличьте значение xxx в соответствии с вашими потребностями, значение будет дано в виде дробной части фигуры, поэтому bottom=0.2 будет располагать нижнюю часть графика на 20% высоты фигуры.

Другая проблема заключается в что вы используете plt.table(), который был сделан, чтобы таблица "прилипала" к осям. Если вы поместите таблицу ниже осей, то в основном она должна заменить метки оси X. Но вы должны выбрать между loc= (автоматическое c размещение) или 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...