Matplotlib: категорический сюжет без строк и инверсии осей - PullRequest
0 голосов
/ 25 ноября 2018

Давайте возьмем этот фрагмент Python:

import matplotlib.pyplot as plt

x = [5,4,3,2,1,0]
x_strings = ['5','4','3','2','1','0']
y = [0,1,2,3,4,5]

plt.figure()

plt.subplot(311)
plt.plot(x, y, marker='o')

plt.subplot(312)
plt.plot(x_strings, y, marker='^', color='red')

plt.subplot(313)
plt.plot(x, y, marker='^', color='red')
plt.gca().invert_xaxis()

plt.show()

, который создает три следующих субплота:

enter image description here

В верхнем субплотеx значения автоматически сортируются все чаще, несмотря на их порядок в данном списке.Если я хочу построить x против y точно в заданном порядке x, тогда у меня есть две возможности:

1) Преобразовать значения x в строки и получить категоричный график - этосредний субплот.

2) Инвертировать ось X - это нижний субплот.

Вопрос: есть ли другой способ сделать своего рода категориальный график, но без преобразования чиселв строки и без инверсии оси x?

ADD-ON:

Если я использую set_xticklabels(list), то по какой-то непонятной причине первый элемент всписок пропущен (неважно, ссылаюсь ли я на x или на x_strings список), и результирующий сюжет также совершенно странный:

import matplotlib.pyplot as plt

x = [5,4,3,2,1,0]
x_strings = ['5','4','3','2','1','0']
y = [0,1,2,3,4,5]

fig, ax = plt.subplots()

ax.set_xticklabels(x)
ax.plot(x, y, marker='^', color='red')

plt.show()

enter image description here

Ответы [ 2 ]

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

Я нашел другой способ сделать это, не будучи абсолютно категоричным и без инверсии оси x!

ax = plt.subplot()
ax.set_xlim(x[0],x[-1], auto=True) # this line plays the trick
plt.plot(x, y, marker='^', color='red')

enter image description here

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

Обе попытки решения кажутся возможными.Кроме того, вы всегда можете имитировать категориальные графики, нанося целые числа и устанавливая метки по своему вкусу.

import matplotlib.pyplot as plt

x = [5,4,3,2,1,0]
y = [0,1,2,3,4,5]

fig, ax = plt.subplots()

ax.plot(range(len(y)), y, marker='^', color='red')

ax.set_xticks(range(len(y)))
ax.set_xticklabels(x)

plt.show()

enter image description here

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