сортировка этикеток в матплотлибе - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий код для диаграммы рассеяния, и соответствующий график показан ниже:

x = ['C9-U2', 'C10-U5', 'C10-U5', 'C11-U1', 'C11-U1']
y = ['J',     'C',      'H',      'J',     'H']
plt.scatter(x,y)

enter image description here

На графике мне бы хотелось, чтобы обе оси были отсортированы, т. Е. Ось х должна быть [C9, C10, C11] (что и есть, потому что я ввел данные в этой последовательности), и Ось Y должна быть [C, H, J] (это не так).

Как мне убедиться, что обе оси отсортированы?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

На самом деле это проблема, для которой на данный момент нет хорошего решения. Единицы оси определяются по мере их поступления от входа. Таким образом, решение состоит в том, чтобы предварительно определить категориальный порядок вручную, сначала вычерчивая что-то в правильном порядке, а затем снова удаляя его.

import matplotlib.pyplot as plt

x = ['C9-U2', 'C10-U5', 'C10-U5', 'C11-U1', 'C11-U1']
y = ['J',     'C',      'H',      'J',     'H']

def unitsetter(xunits, yunits, ax=None, sort=True):
    ax = ax or plt.gca()
    if sort:
        xunits = sorted(xunits)
        yunits = sorted(yunits)
    us = plt.plot(xunits, [yunits[0]]*len(xunits),
                  [xunits[0]]*len(yunits), yunits)
    for u in us:
        u.remove()

unitsetter(x,y)
plt.scatter(x,y)

plt.show()

enter image description here

Здесь sort имеет значение True, поэтому вы получаете отсортированные по алфавиту категории по обеим осям.

Если у вас есть заказ, который вы хотите, чтобы ось подчинялась, как здесь (по крайней мере, для оси x), вам нужно будет передать этот порядок вышеупомянутой функции.

unitsetter(x, sorted(y), sort=False)
plt.scatter(x,y)

enter image description here

0 голосов
/ 07 ноября 2018

Я немного изменил способ создания вашей диаграммы рассеяния.

Вот мой код:

import matplotlib.pyplot as plt

# This is your original code.
# x = ['C9-U2', 'C10-U5', 'C10-U5', 'C3-U1', 'C3-U1']
# y = ['J',     'C',      'H',      'J',     'H']
# plt.scatter(x,y)
# plt.show()

ordered_pairs = set([
     ('C9-U2', 'J'),
     ('C10-U5', 'C'),
     ('C10-U5', 'H'),
     ('C3-U1', 'J'),
     ('C3-U1', 'H')
])

x,y = zip(*ordered_pairs)
plt.scatter(x, y)
plt.show()

Я превратил ваши точки данных в set упорядоченных пар. Это позволяет нам zip набор, который используется для упаковки и распаковки массивов с каждым переданным аргументом. Мы используем оператор *, чтобы инвертировать процесс. Вы можете узнать больше о zip здесь .

Когда код запускается, показанное изображение выглядит следующим образом, и я надеюсь, что вы искали:

result_of_shown_code

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