Формат yticks для отображения процентов (0-100)% с шагом 10 для каждого подзаголовка в подзаголовке

#python-3.x #matplotlib #subplot #ticker

#python-3.x #matplotlib #подзаголовок #бегущая строка

Вопрос:

Я пытаюсь отформатировать yticks на Subplot изображении, чтобы они выглядели так, как на Single Plot изображении. Я использую следующий код, который работает для Single Plot , но не для Subplot .

Один график

Подзаголовок

 from matplotlib.ticker import FormatStrFormatter

fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
 

Ниже приведены коды для обоих графиков и образцов данных

 x = ['2016-01', '2016-02', '2016-03', '2016-04', '2016-05', '2016-06']
final_df['abandonment_rate(%)'] = [70.00, 78.25, 15.25, 53.78, 62.75, 11.00]
final_df['booking_rate(%)'] = [50.00, 28.25, 35.25, 33.78, 12.75, 21.00]
 

Код одного графика

Форматирование yaxis в этом коде генерирует желаемую маркировку ytick.

 x = [i for i in checkins_df_entire_apt['month_yr'].apply(lambda x: x.strftime('%Y-%m'))]
x_indexes = np.arange(len(x))
width = 0.25

fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
rects1 = ax.bar(x_indexes   0.25, 
         final_df['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
rects2 = ax.bar(x_indexes   0.5, 
         final_df['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")
plt.legend(("Abandonment Rate (%)", "Conversion Rate (%)"), fontsize=25)
plt.xticks(ticks=x_indexes   1.5*width, labels=x, fontsize=20)
plt.yticks(fontsize=20)
plt.title("As percentage of Interaction Started", fontsize=30, ha='center')
plt.suptitle("Overall conversion/abandonment rate - Entire Apartment", fontsize=40, ha='center')
plt.xlabel("Month-yr", fontsize=40)
plt.ylabel("Conversion Rate (%)", fontsize=40)

def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{} %'.format(height),
                    xy=(rect.get_x()   rect.get_width() / 2, height),
                    xytext=(18, 15),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom', fontsize=20)

autolabel(rects1)
autolabel(rects2)

plt.show()
 

Код подзаголовка

Но по какой-то причине форматирование в следующем фрагменте кода не работает.

 x = [i for i in checkins_df_private_room['month_yr'].apply(lambda x: x.strftime('%Y-%m'))]
x_indexes = np.arange(len(x))
width = 0.20

fig, ax = plt.subplots(3, 1, sharex=True)
top_ax, middle_ax, bottom_ax = ax

# Private Room
plt.subplot(3, 1, 1)
top_ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
plt.bar(x_indexes   0.00, 
         checkins_df_private_room['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
plt.bar(x_indexes   0.20, 
         checkins_df_private_room['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

plt.xticks(ticks=x_indexes   0.5*width, labels=x, fontsize=20)
plt.legend(loc='upper right', fontsize=30)

plt.yticks(fontsize=20)
plt.ylabel("Private Room", fontsize=30)

# Entire Apartment
plt.subplot(3, 1, 2)
middle_ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
plt.bar(x_indexes   0.00, 
         checkins_df_entire_apt['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
plt.bar(x_indexes   0.20, 
         checkins_df_entire_apt['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

plt.xticks(ticks=x_indexes   0.5*width, labels=x, fontsize=20)

plt.yticks(fontsize=20)
plt.ylabel("Entire Apartment", fontsize=30)

# Shared Room
plt.subplot(3, 1, 3)
bottom_ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
plt.bar(x_indexes   0.00, 
         checkins_df_shared_room['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
plt.bar(x_indexes   0.20, 
         checkins_df_shared_room['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

plt.xticks(ticks=x_indexes   0.5*width, labels=x, fontsize=20)
plt.suptitle("Overall conversion/abandonment rate - Apartment Type", fontsize=40, ha='center')
plt.xlabel("Month-yr", fontsize=40)

plt.yticks(fontsize=20)
plt.ylabel("Shared Room", fontsize=30)

plt.show()
 

Комментарии:

1. Примечание, но почему бы просто не использовать PercentFormatter ?

2. Я пытался top_ax.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=100, symbol='%')) , но это не работает!

3. Также я использую plt.subplot(3, 1, 1) для обозначения каждого подзаголовка по отдельности. Не уверен, есть ли лучший способ сделать это. Обозначьте ось y

4. Вы смешиваете объектно-ориентированные и основанные на состояниях интерфейсы . Вы должны быть последовательными.

5. Эй, спасибо, что указали на это! Это сработало!

Ответ №1:

Решение

Желаемый график

 x = [i for i in checkins_df_private_room['month_yr'].apply(lambda x: x.strftime('%Y-%m'))]
x_indexes = np.arange(len(x))
y_indexes = np.arange(0, 110, 10)
width = 0.20

fig, ax = plt.subplots(3,1)
top_ax, middle_ax, bottom_ax = ax

################
# Private Room #
################

top_ax.bar(x_indexes   0.00, 
         checkins_df_private_room['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
top_ax.bar(x_indexes   0.20, 
         checkins_df_private_room['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

# plt.xticks(ticks=x_indexes   0.5*width, labels=x, fontsize=20)
top_ax.legend(fontsize=30, loc='upper right')
top_ax.set_title('(Private Room)', fontsize=30)
top_ax.set_xticks(ticks=x_indexes   0.5*width)
top_ax.set_xticklabels(labels=x, fontsize=30)

top_ax.set_yticks(ticks=y_indexes)
top_ax.set_yticklabels(y_indexes, fontsize = 30)

####################
# Entire Apartment #
####################

middle_ax.bar(x_indexes   0.00, 
         checkins_df_entire_apt['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
middle_ax.bar(x_indexes   0.20, 
         checkins_df_entire_apt['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

middle_ax.set_xticks(ticks=x_indexes   0.5*width)
middle_ax.set_xticklabels(labels=x, fontsize=30)
middle_ax.set_yticks(ticks=y_indexes)
middle_ax.set_yticklabels(y_indexes, fontsize = 30)
middle_ax.set_ylabel('As Percentage of Interaction Started (%)', 
                     fontsize=40)
middle_ax.set_title('(Entire Apartment)', fontsize=30)

###############
# Shared Room #
###############

bottom_ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f%%'))
bottom_ax.bar(x_indexes   0.00, 
         checkins_df_shared_room['abandonment_rate(%)'],
         width=width,
         color="#484848", 
         label="Abandonment Rate (%)")
bottom_ax.bar(x_indexes   0.20, 
         checkins_df_shared_room['booking_rate(%)'],
         width=width,
         color="#00A699", 
         label="Booking Rate (%)")

bottom_ax.set_xticks(ticks=x_indexes   0.5*width)
bottom_ax.set_xticklabels(labels=x, fontsize=30)
bottom_ax.set_yticks(ticks=y_indexes)
bottom_ax.set_yticklabels(y_indexes, fontsize=30)
bottom_ax.set_xlabel('Month-Yr', fontsize=40)
bottom_ax.set_title('(Shared Room)', fontsize=30)

plt.suptitle("Overall conversion/abandonment rate - Apartment Type", fontsize=50, ha='center')

plt.show()