Пример кода, приведенный здесь, генерирует этот график:

enter image description here

Я хочу знать, возможно ли построить то же самое, но «зеркально», например так:

enter image description here

Вот пример кода, предоставленного на случай, если ссылка перестанет работать:

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)


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

# Example data
people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
error = np.random.rand(len(people))

ax.barh(y_pos, performance, xerr=error, align='center',
        color='green', ecolor='black')
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.invert_yaxis()  # labels read top-to-bottom
ax.set_xlabel('Performance')
ax.set_title('How fast do you want to go today?')

plt.show()
5
Tendero 25 Сен 2018 в 19:50

2 ответа

Лучший ответ

Вы были близки, вы забыли поставить ax.invert_xaxis(). Но, тем не менее, вы назначили y-галочки на левой оси Y.

Чтобы назначить галочки с правой стороны, вам нужно сначала создать двойной экземпляр оси x (правая сторона оси y) (здесь ax1), а затем нанести на него столбцы. Вы можете скрыть пометки и метки с левой стороны оси Y, передав [].

Я представляю два способа ее решения (остальная часть кода остается прежней, за исключением того, что теперь вы используете ax1 вместо ax)

Решение 1

ax.set_yticklabels([]) # Hide the left y-axis tick-labels
ax.set_yticks([]) # Hide the left y-axis ticks
ax1 = ax.twinx() # Create a twin x-axis
ax1.barh(y_pos, performance, xerr=error, align='center',
    color='green', ecolor='black') # Plot using `ax1` instead of `ax`
ax1.set_yticks(y_pos)
ax1.set_yticklabels(people)

Решение 2 (тот же вывод) : держите график на левой оси (ax), инвертируйте ось x и установите метки y на ax1

ax.invert_yaxis()  # labels read top-to-bottom
ax.invert_xaxis()  # labels read top-to-bottom

ax2 = ax.twinx()
ax2.set_ylim(ax.get_ylim())
ax2.set_yticks(y_pos)
ax2.set_yticklabels(people)

enter image description here

2
Sheldore 25 Сен 2018 в 17:21

Альтернативным способом было бы просто установить инвертированные пределы по оси X, например так:

ax.set_xlim(14,0)
0
Julian 7 Дек 2019 в 16:47