На самом деле это проблема, для которой на данный момент нет хорошего решения. Единицы оси определяются по мере их поступления от входа. Таким образом, решение состоит в том, чтобы предварительно определить категориальный порядок вручную, сначала вычерчивая что-то в правильном порядке, а затем снова удаляя его.
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()

Здесь sort
имеет значение True
, поэтому вы получаете отсортированные по алфавиту категории по обеим осям.
Если у вас есть заказ, который вы хотите, чтобы ось подчинялась, как здесь (по крайней мере, для оси x), вам нужно будет передать этот порядок вышеупомянутой функции.
unitsetter(x, sorted(y), sort=False)
plt.scatter(x,y)
