Создание альтернативных меток оси Y для горизонтальной линейной диаграммы с помощью matplotlib - PullRequest
0 голосов
/ 04 сентября 2018

Это (более ясный) репост вопроса, который я только что задал, мое отождествление смущало людей.

Привет, я новичок в графике на python с использованием matplotlib.pyplot и потратил много времени на поиск на этом сайте и на других сайтах, пытаясь выяснить это, но мне не удалось выполнить то, что я хотел делать.

Используя приведенный ниже код, я сгенерировал следующую диаграмму, которая представляет собой набор курсов и процент тех, кто поступил на курсы: Что мой код создает:

Однако то, что я хотел бы сгенерировать с помощью Python, выглядит примерно так (грубо сделано в MS paint, чтобы передать вам все, что я хотел бы, чтобы мой код генерировал):

Что я хочу создать:

Ярлыки на правой стороне оси - это количество человек, записавшихся на каждый курс, и это дополнительная информация, которую я хотел бы показать. Альтернативное решение состоит в том, чтобы на графике отображались номера регистрации, написанные на / в конце столбцов. Но все, что работает, хорошо.

import matplotlib.pyplot as plt
y = ['Physics','Chemistry','Economics','Philosophy','Computer Science','Sociology','Biology','History','Overall']
x = [0.0,33.333333333333336,50.0,50.0,50.0,54.54545454545455,58.333333333333336,100.0,51.851851851851855]
alternativeYlabels = ['54', '1', '3', '12', '12', '2', '11', '12', '1']
plt.barh(y,x)
plt.title('Percent Completion Rate of Each Course')

plt.show()

Как я могу изменить свой код в соответствии со своими потребностями? Кроме того, как я мог бы добавить вертикальные линии сетки на моем графике, соответствующие каждому 20% здесь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я адаптировал код из этого примера matplotlib, который имеет две отдельные шкалы с обеих сторон графика. Основное отличие состоит в том, что здесь второй столбец является фиктивным (каждый столбец имеет высоту 0). Я думаю, что это самый простой способ сделать это (без добавления галочек и т. Д.)

# Initialize parameters as in your post
import matplotlib.pyplot as plt
y = ['Physics','Chemistry','Economics','Philosophy','Computer Science','Sociology','Biology','History','Overall']
x = [0.0,33.333333333333336,50.0,50.0,50.0,54.54545454545455,58.333333333333336,100.0,51.851851851851855]
alternativeYlabels = ['54', '1', '3', '12', '12', '2', '11', '12', '1']

# This time draw the bar plot from an 'axes' object
ax1 = plt.subplot(111)
ax1.barh(y,x)

# Draw a second 'dummy' barplot just to define the second ticks
ax2 = ax1.twinx()
ax2.barh(range(len(x)), [0]*len(x), tick_label=alternativeYlabels[::-1])  # don't forget to reverse the labels 

# Add the vertical grid
ax1.xaxis.grid(True)

# Add a title and show figure
plt.title('Percent Completion Rate of Each Course')
plt.show()

Выполнение кода ниже должно привести к следующему значению:

dual scales

0 голосов
/ 04 сентября 2018

Вот оба решения: Вам нужно добавить ось twinx. Добавьте следующие строки перед вашим plt.show(). Если вы хотите поместить значения сверху столбцов вместо второй оси Y с правой стороны, вы можете взглянуть на этот аналогичный ответ, который я предоставил несколько недель назад (я прикрепил код ниже а также вместе с выводом).

ax.xaxis.grid(True) # adding vertical grid lines
ax2 = ax.twinx() # Creating the right hand side y axis
ax_lim = ax.get_ylim()
ax2_lim = (ax_lim[0], ax_lim[1]) # Aligning the limits of both y axes
ax2.set_ylim(ax2_lim)
ax2.set_yticks(range(0, len(y)))
ax2.set_yticklabels(alternativeYlabels[::-1]) # Reverses the list
ax2.set_ylabel("# enrolled in each course",rotation = 270, labelpad=15)

выход

enter image description here

Альтернативный желаемый вывод (см. Ссылку в ответе). РЕДАКТИРОВАТЬ: вертикальное выравнивание текста на основе предложения @ ImportanceOfBeingErnest

ax.xaxis.grid(True)
for i in range(len(x)):
    ax.text(x[i]+1, i, alternativeYlabels[::-1][i], color='black', fontweight='bold', va="center")

выход

enter image description here

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