Respostas:
Como alternativa, se você deseja simplesmente definir o número de ticks enquanto permite que o matplotlib os posicione (atualmente apenas com MaxNLocator), existe pyplot.locator_params,
pyplot.locator_params(nbins=4)
Você pode especificar um eixo específico nesse método, conforme mencionado abaixo; o padrão é ambos:
# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)
numticksvez denbins
numtickssolução para gráficos logarítmicos, como apontado por @meduz?
[0, 1, ..., 99]e agora se definem nticks=10, os novos rótulos esparsos serão colocados dez vezes mais afastados ao longo do eixo, ou seja, agora 1ficarão onde 9estava, 2onde 19estava ... e 9onde 99estava.
Se alguém ainda receber essa página nos resultados da pesquisa:
fig, ax = plt.subplots()
plt.plot(...)
every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
if n % every_nth != 0:
label.set_visible(False)
Para resolver o problema de personalização e aparência dos ticks, consulte o guia Localizadores de ticks no site matplotlib
ax.xaxis.set_major_locator(plt.MaxNLocator(3))
Definiria o número total de ticks no eixo x como 3 e o distribuiria uniformemente pelo eixo.
Há também um bom tutorial sobre isso
ax = df.plot()
pandas.DataFrame) com índice datetime [2019-01-01, ... 2019-11-01], call ax = df.plot(), retorne um objeto de figura. a chamada ax.xaxis.set_major_locator(plt.MaxNLocator(3)) mostra apenas o primeiro índice 3 [2019-01-01, 2019-01-02, 2019-01-03].
df.plot()muitas vezes exibe o minor_locator, então você pode querer tentar ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Lembre-se também de substituir o 3número de ticks que deseja exibir. Para pandas timeseries Eu recomendo import matplotlib.dates as mdatese executar ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))comax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Há uma set_ticks()função para objetos de eixo.
get_xticks()ou get_yticks()primeiro o objeto de eixos, editar conforme necessário e depois passar a lista de volta para set_ticks().
set_ticks(), mas eu tenho set_xticks()e set_yticks(). Esses são atributos dos objetos dos eixos, não do eixo. Talvez isso tenha mudado nos últimos dois anos.
caso alguém ainda precise, e como nada aqui realmente funcionou para mim, criei uma maneira muito simples que mantém a aparência do gráfico gerado "como está", enquanto fixa o número de ticks exatamente N:
import numpy as np
import matplotlib.pyplot as plt
f, ax = plt.subplots()
ax.plot(range(100))
ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))
ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
A solução que a @raphael deu é direta e bastante útil.
Ainda assim, os rótulos de marca de seleção exibidos não serão valores amostrados da distribuição original, mas dos índices da matriz retornados por np.linspace(ymin, ymax, N).
Para exibir N valores espaçados igualmente de seus rótulos de marca originais, use o set_yticklabels()método Aqui está um trecho para o eixo y, com rótulos inteiros:
import numpy as np
import matplotlib.pyplot as plt
ax = plt.gca()
ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)
Quando uma escala de log é usada, o número de ticks principais pode ser corrigido com o seguinte comando
import matplotlib.pyplot as plt
....
plt.locator_params(numticks=12)
plt.show()
O valor definido como numticksdetermina o número de marcações do eixo a serem exibidas.
Créditos à postagem de @ bgamari pela introdução da locator_params()função, mas o nticksparâmetro gera um erro quando uma escala de log é usada.
pyplot.locator_params(axis = 'x', nbins = 4)(ouaxis = 'y') tornar o processo realmente simples. Obrigado @bgamari!