Quero fazer algumas modificações em alguns rótulos de carrapatos selecionados em um gráfico.
Por exemplo, se eu fizer:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
o tamanho da fonte e a orientação do rótulo do tick são alterados.
No entanto, se tentar:
label.set_text('Foo')
o rótulo do carrapato não é modificado. Além disso, se eu fizer:
print label.get_text()
nada é impresso.
Aqui está um pouco mais de estranheza. Quando eu tentei isso:
from pylab import *
axes = figure().add_subplot(111)
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
print ticklabel.get_text()
Somente seqüências de caracteres vazias são impressas, mas o gráfico contém marcações marcadas como '0.0', '0.5', '1.0', '1.5' e '2.0'.
python
matplotlib
repoman
fonte
fonte
draw()
antes de tentar imprimir as etiquetas, obterá o que espera. Infelizmente, a definição de rótulos de ticks individuais é um pouco mais difícil (o que está acontecendo é que o localizador e o formatador de ticks não foram redefinidos e substituem as coisas quando vocêset_text
). Vou adicionar um exemplo daqui a pouco, se alguém não me vencer. Eu tenho que pegar o ônibus, no momento, no entanto.Respostas:
Advertência: A menos que os ticklabels já estejam definidos como uma string (como é geralmente o caso, por exemplo, em um boxplot), isso não funcionará com nenhuma versão do matplotlib mais recente
1.1.0
. Se você estiver trabalhando com o mestre atual do github, isso não funcionará. Ainda não tenho certeza de qual é o problema ... Pode ser uma alteração não intencional ou pode não ser ...Normalmente, você faria algo assim:
Para entender o motivo pelo qual você precisa passar por tantos obstáculos, você precisa entender um pouco mais sobre como o matplotlib está estruturado.
O Matplotlib evita deliberadamente o posicionamento "estático" de ticks, etc., a menos que seja explicitamente solicitado. Supõe-se que você deseje interagir com o enredo, e assim os limites do enredo, ticks, ticklabels etc. serão alterados dinamicamente.
Portanto, você não pode simplesmente definir o texto de um determinado rótulo de marca. Por padrão, é redefinido pelo Localizador e formatador do eixo toda vez que o gráfico é desenhado.
No entanto, se os localizadores e os formatadores estiverem definidos como estáticos (
FixedLocator
eFixedFormatter
, respectivamente), os rótulos dos marcadores permanecerão os mesmos.Isto é o que
set_*ticklabels
ouax.*axis.set_ticklabels
faz.Espero que isso torne um pouco mais claro o motivo pelo qual a alteração de um rótulo de marca individual é um pouco complicada.
Muitas vezes, o que você realmente deseja fazer é apenas anotar uma certa posição. Nesse caso, examine
annotate
.fonte
bold
enquanto outros usam o peso da fonte de "light". Existe uma forma de fazer isso?fig.canvas.draw()
é crucialTambém é possível fazer isso com o pylab e o xticks
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
fonte
Nas versões mais recentes de
matplotlib
, se você não definir os rótulos de ticks com váriosstr
valores, eles são''
por padrão (e quando o gráfico é desenhado, os rótulos são simplesmente os valores dos ticks). Sabendo disso, para obter a saída desejada, seria necessário algo como isto:e o resultado:
e agora, se você verificar
_xticklabels
, eles não são mais um monte de''
.Ele funciona nas versões da
1.1.1rc1
versão atual2.0
.fonte
set_xticklabels
uma lista mista de strings e objetos de tick.ax.get_xticks().tolist()
). A solução mais votada não (ax.get_xtickslabels()
). De alguma forma, não foi possível extrair os rótulos antes daplt.show()
extração, embora eu tenha usadofig.canvas.draw()
como sugerido.Já faz um tempo desde que essa pergunta foi feita. A partir de hoje (
matplotlib 2.2.2
) e depois de algumas leituras e testes, acho que a melhor / melhor maneira é a seguinte:Matplotlib tem um módulo chamado
ticker
que "contém classes para suporte de localização carrapato completamente configurável e formatação" . Para modificar um tick específico da plotagem, o seguinte funciona para mim:Embargo!
x
é o valor do tick epos
é sua posição relativa em ordem no eixo. Observe quepos
aceita valores começando em1
, não0
como de costume durante a indexação.No meu caso, eu estava tentando formatar o
y-axis
histograma com valores percentuais.mticker
tem outra classe chamadaPercentFormatter
que pode fazer isso facilmente sem a necessidade de definir uma função separada como antes:Nesse caso,
xmax
é o valor dos dados que corresponde a 100%. As porcentagens são calculadas comox / xmax * 100
, é por isso que corrigimosxmax=1.0
. Além disso,decimals
é o número de casas decimais após o ponto.fonte
A classe de eixos possui uma função set_yticklabels que permite definir os rótulos dos ticks , da seguinte maneira:
Ainda estou trabalhando por que o seu exemplo acima não funcionou.
fonte
Isso funciona:
fonte
Isso também funciona no matplotlib 3:
fonte
Se você não trabalha com
fig
eax
deseja modificar todos os rótulos (por exemplo, para normalização), pode fazer o seguinte:fonte
Tente o seguinte:
fonte
você pode fazer:
fonte