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)
numticks
vez denbins
numticks
soluçã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 1
ficarão onde 9
estava, 2
onde 19
estava ... e 9
onde 99
estava.
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 3
número de ticks que deseja exibir. Para pandas timeseries Eu recomendo import matplotlib.dates as mdates
e 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 numticks
determina 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 nticks
parâ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!