Измените ось графика так, чтобы порядок ее меток и их соответствующих точек изменялся соответствующим образом - без изменения самих данных. - PullRequest
3 голосов
/ 31 мая 2019

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

Пример

y = [5,8,9,10]
x = ['a', 'b', 'c', 'd']
plt.plot(y, x)

Original plot

Как я хочу, чтобы график выглядел, изменяя расположение отметок на оси.Intended image

Обратите внимание, что я не хочу этого добиться, изменив порядок своих данных

Моя попытка

# attempt 1
fig, ax =plt.subplots()
plt.plot(y,x)
ax.set_xticklabels(['b', 'c', 'a', 'd'])
# this just overwrites the labels, not what we intended

# attempt2
fig, ax =plt.subplots()
plt.plot(y,x)
locs, labels = plt.xticks()
plt.xticks((1,2,0,3)); # This is essentially showing the location 
# of the labels to dsiplay irrespective of the order of the tuple.

Редактировать: Основываясь на комментариях, здесь приведены некоторые дополнительные пояснения.

Скажем, первый пункт (a,5) на рисунке 1. Если я изменилсямое определение x-axis такое, что a теперь определено в третьей позиции, затем оно также отражается на графике, что означает, что 5 на y-axis перемещается с a, как показано на рис-2.Один из способов добиться этого - переупорядочить данные.Тем не менее, я хотел бы посмотреть, возможно ли это как-то добиться путем изменения расположения осей.Подводя итог, данные должны быть построены на основе того, как мы определяем нашу пользовательскую ось без переупорядочения исходных данных.

Edit2: Исходя из обсуждения в комментариях, это невозможно сделать, просто изменив метки оси.Любой подход будет включать изменение данных.Это было упрощение первоначальной проблемы, с которой я столкнулся.Наконец, использование надписей на основе словаря во фрейме данных pandas помогло мне отсортировать значения осей в определенном порядке, а также убедиться, что их соответствующие значения изменяются соответствующим образом.

1 Ответ

2 голосов
/ 01 июня 2019

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

import numpy as np
import matplotlib.pyplot as plt

x = ['a', 'b', 'c', 'd']
y = [5,8,9,10]

order1 = ['a', 'b', 'c', 'd']
order2 = ['b', 'c', 'a', 'd']

fig, ax = plt.subplots()
line, = ax.plot(x, y, marker="o")

def toggle(order):
    _, ind1 = np.unique(x, return_index=True)
    _, inv2 = np.unique(order, return_inverse=True)
    y_new = np.array(y)[ind1][inv2]

    line.set_ydata(y_new)
    line.axes.set_xticks(range(len(order)))
    line.axes.set_xticklabels(order)
    fig.canvas.draw_idle()

curr = [0]
orders = [order1, order2]
def onclick(evt):
    curr[0] = (curr[0] + 1) % 2
    toggle(orders[curr[0]])


fig.canvas.mpl_connect("button_press_event", onclick)

plt.show()

Щелкните в любом месте графика, чтобы переключиться между order1 и order2.

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