Matplotlib set x tick label не меняет порядок - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу сделать линейный график, на котором по существу (Dog, 1), (Cat, 2), (Bird, 3) и т. Д. Наносятся на график и соединяются линией.Кроме того, я хотел бы иметь возможность определить порядок метки на оси X.Matplotlib автоматически наносится с метками «Dog», «Cat» и «Bird».Несмотря на мою попытку реорганизовать порядок на «Собака», «Птица», «Жираф», «Кошка», график не меняется (см. Изображение).Что я должен сделать, чтобы иметь возможность правильно расположить график? enter image description here

x = ['Dog','Cat','Bird','Dog','Cat','Bird','Dog','Cat','Cat','Cat']
y = [1,2,3,4,5,6,7,8,9,10]
x_ticks_labels = ['Dog','Bird','Giraffe','Cat']

fig, ax = plt.subplots(1,1) 
ax.plot(x,y)

# Set number of ticks for x-axis
ax.set_xticks(range(len(x_ticks_labels)))
# Set ticks labels for x-axis
ax.set_xticklabels(x_ticks_labels)

1 Ответ

0 голосов
/ 08 февраля 2019

Использование категориальной функции matplotlib

Вы можете заранее определить порядок категорий на осях, сначала вычерчивая что-то в правильном порядке, а затем удаляя его снова.

import numpy as np
import matplotlib.pyplot as plt

x = ['Dog','Cat','Bird','Dog','Cat','Bird','Dog','Cat','Cat','Cat']
y = [1,2,3,4,5,6,7,8,9,10]
x_ticks_labels = ['Dog','Bird','Giraffe','Cat']

fig, ax = plt.subplots(1,1) 

sentinel, = ax.plot(x_ticks_labels, np.linspace(min(y), max(y), len(x_ticks_labels)))
sentinel.remove()
ax.plot(x,y, color="C0", marker="o")

plt.show()

Определите индексы значений

Другой вариант - определить индексы, которые значения из x будут принимать внутри x_tick_labels.К сожалению, нет канонического способа сделать это;здесь я беру решение из этого ответа , используя np.where.Затем можно просто построить значения y по этим индексам и установить соответствующие отметки и метки.

import numpy as np
import matplotlib.pyplot as plt

x = ['Dog','Cat','Bird','Dog','Cat','Bird','Dog','Cat','Cat','Cat']
y = [1,2,3,4,5,6,7,8,9,10]
x_ticks_labels = ['Dog','Bird','Giraffe','Cat']

xarr = np.array(x)
ind = np.where(xarr.reshape(xarr.size, 1) == np.array(x_ticks_labels))[1]

fig, ax = plt.subplots(1,1) 

ax.plot(ind,y, color="C0", marker="o")
ax.set_xticks(range(len(x_ticks_labels)))
ax.set_xticklabels(x_ticks_labels)

plt.show()

Результат в обоих случаях

enter image description here

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