#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)
для обозначения каждого подзаголовка по отдельности. Не уверен, есть ли лучший способ сделать это. Обозначьте ось y4. Вы смешиваете объектно-ориентированные и основанные на состояниях интерфейсы . Вы должны быть последовательными.
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()