Добавление меток осей «неортодоксальных» осей в pyplot - PullRequest
2 голосов
/ 29 апреля 2019

Я нашел отличный учебник по составлению тепловой карты для матрицы путаницы , но я хочу добавить некоторые ошибки комиссии и упущения по сторонам.

Я попытаюсь объяснить, используя это изображение:

confusion matrix

Это означает:

  1. Мне нужно вставить число рядом с каждым из полей, содержащих 0, 6 и 9, справа от правого края изображения и слева от легенды

  2. Мне нужно вставить число над каждым из полей, содержащих 13, 0 и 0, чуть выше верхнего края изображения, чуть ниже заголовка.

(итого 6 номеров)

Это вообще возможно? Я ничего не знаю о функциях построения графиков в Python, так как я новичок в этом языке. Это просто кажется очень трудным заданием, с которого я стою.

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Используйте следующую модифицированную функцию. Идея следующая:

  • Добавьте две сдвоенные оси - одну справа и другую сверху.
  • Установите пределы двойных осей, равные пределам исходных осей
  • Установите положение галочек на сдвоенных осях так же, как и у исходных осей
  • Скрыть метки и назначить метки
  • Сместить заголовок немного вверх, используя y=1.1

def plot_confusion_matrix(y_true, y_pred, classes, normalize=False,
                          title=None, cmap=plt.cm.Blues):
    if not title:
        if normalize:
            title = 'Normalized confusion matrix'
        else:
            title = 'Confusion matrix, without normalization'

    cm = confusion_matrix(y_true, y_pred)
    classes = classes[unique_labels(y_true, y_pred)]
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    fig, ax = plt.subplots(figsize=(6.5,6))
    im = ax.imshow(cm, interpolation='nearest', cmap=cmap)
    ax.figure.colorbar(im, ax=ax)
    ax.set(xticks=np.arange(cm.shape[1]),
           yticks=np.arange(cm.shape[0]),
           xticklabels=classes, yticklabels=classes,
           ylabel='True label',
           xlabel='Predicted label')
    ax.set_title(title, y=1.1)
    plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
             rotation_mode="anchor")

    # Adding data to the right
    ax2 = ax.twinx()
    ax2.set_ylim(ax.get_ylim())
    ax2.set_yticks(np.arange(cm.shape[0]))
    ax2.set_yticklabels(cm[:, -1])
    ax2.tick_params(axis="y", right=False)

    # Adding data to the top
    ax3 = ax.twiny()
    ax3.set_xlim(ax.get_xlim())
    ax3.set_xticks(np.arange(cm.shape[0]))
    ax3.set_xticklabels(cm[:, 0])
    ax3.tick_params(axis="x", top=False)
    ax.set_aspect('auto')


    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i in range(cm.shape[0]):
        for j in range(cm.shape[1]):
            ax.text(j, i, format(cm[i, j], fmt),
                    ha="center", va="center",
                    color="white" if cm[i, j] > thresh else "black")
    fig.tight_layout()
    return ax

enter image description here

1 голос
/ 29 апреля 2019

Вы можете сделать это, используя галочки.

Позвольте мне представить этот подход следующим простым сюжетом:

from matplotlib import pyplot as plt

ax = plt.axes()
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)

for i in range(3):
    for j in range(3):
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)

plt.show()

enter image description here

Я не буду фокусироваться ни на цветах, ни на стиле тиков, но знаю, что вы можете изменить их очень легко.

Вы можете создать объект Axes, который будет иметь общую ось Y ax с ax.twiny(). Затем вы можете добавить X тиков на этот новый Axes, который появится в верхней части графика:

from matplotlib import pyplot as plt

ax = plt.axes()
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)

for i in range(3):
    for j in range(3):
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)

ax2 = ax.twiny()
ax2.set_xlim(ax.get_xlim())
ax2.set_xticks([0.5, 1.5, 2.5])
ax2.set_xticklabels([13, 0, 0])

plt.show()

enter image description here

Чтобы отобразить отметки для оси X, вы должны создать объект Axes, который разделяет ось Y ax с ax.twiny(). Это может показаться нелогичным, но если вместо этого вы используете ax.twinx(), то изменение X тиков ax2 также изменит ax, потому что они на самом деле одинаковы. Затем вы хотите установить для окна X значение ax2, чтобы оно имело три квадрата. После этого вы можете установить галочки: по одному в каждом квадрате, в горизонтальном центре, поэтому на [0.5, 1.5, 2.5]. Наконец, вы можете установить метки для отображения желаемого значения.

Затем, вы просто делаете то же самое с галочками Y:

from matplotlib import pyplot as plt

ax = plt.axes()
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)

for i in range(3):
    for j in range(3):
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)
        ax.fill_between((i, i+1), j, j+1)

ax2 = ax.twiny()
ax2.set_xlim(ax.get_xlim())
ax2.set_xticks([0.5, 1.5, 2.5])
ax2.set_xticklabels([13, 0, 0])

ax3 = ax.twinx()
ax3.set_ylim(ax.get_ylim())
ax3.set_yticks([0.5, 1.5, 2.5])
ax3.set_yticklabels([0, 6, 9])

plt.show()

enter image description here

0 голосов
/ 29 апреля 2019

Довольно ручной подход будет состоять в объединении следующих элементов, пока результат не будет удовлетворительным:

  • с использованием twinx и twiny для получения новых осейсверху и справа: twinax = ax.twinx().twiny()
  • , используя twinax.set(xlim=ax.get_xlim(), ylim=ax.get_ylim()), чтобы сопоставить их диапазон с диапазоном исходных осей, затем ...
  • , используя twinax.set(xticks=ax.get_xticks(), yticks=ax.get_yticks, xticklabels=('0','1','2'), yticklabels = ('0','1','2')), чтобы установить меткина новых осях, как это было сделано в вашем примере (эти два вызова могут быть объединены, если хотите).
  • (Если вы не хотите, чтобы действительные метки (только метки), вы можете задать им длину от 0 до tick_params .)
  • Вы можете изменить положение осей с помощью set_position .
  • См. этот вопрос для получения информации о том, как перемещать цветовую панель.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...