Почему set_xticklabels работает только по назначению после использования set_xticks?

#python #matplotlib

Вопрос:

Просматривая демонстрационную гистограмму Matplotlib, я обнаружил, что этот код создал следующий график:

 import matplotlib.pyplot as plt
import numpy as np

N = 5
menMeans = (20, 35, 30, 35, -27)
womenMeans = (25, 32, 34, 20, -25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

fig, ax = plt.subplots()

p1 = ax.bar(x, menMeans, width, yerr=menStd, label='Men')
p2 = ax.bar(x,womenMeans, width, bottom=menMeans, yerr=womenStd, label='Women')

ax.axhline(0, color='grey', linewidth=0.8)
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
# ax.set_xticks(x)
# ax.set_xticklabels(['G1','G2','G3','G4','G5'])
ax.legend()
 

Планка 1

Независимо от того, является ли ax.set_xticks(x) он незафиксированным, я получаю приведенный выше сюжет.
Однако, если я раскомментирую только ax.set_xticklabels(['G1','G2','G3','G4','G5']) это, я получу это:

Барплот 2

Я должен раскомментировать оба ax.set_xticks(x) и ax.set_xticklabels(['G1','G2','G3','G4','G5']) получить желаемый сюжет:

Барплот 3

Может кто-нибудь, пожалуйста, объяснить, почему ax.set_xticks(x) это имеет значение только тогда, когда я тоже звоню ax.set_xticklabels()

Спасибо

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

1. Если вы явно не задали позиции xtick, используются внутренние позиции xtick. Чтобы максимально задержать ненужные вычисления, внутренние позиции xtick действительно устанавливаются только при рисовании (и они могут изменяться, например, при масштабировании). Поэтому, set_xticklabels() чтобы быть надежным, сначала set_xticks() следует позвонить. Обратите внимание, что ваш тест (особенно без предоставления тестовых данных) — это всего лишь один тестовый случай, и поведение будет меняться в зависимости от многих обстоятельств.

2. Если вы запустите ax.get_xticks() после создания графика с ax.set_xticks(x) комментариями и без комментариев, вы увидите, что в данном конкретном случае это действительно влияет на список галочек, не оказывая при этом никакого видимого эффекта на полученное изображение.