Estou usando o matplotlib para fazer gráficos de dispersão. Cada ponto no gráfico de dispersão é associado a um objeto nomeado. Gostaria de poder ver o nome de um objeto quando passar o cursor sobre o ponto no gráfico de dispersão associado a esse objeto. Em particular, seria bom poder ver rapidamente os nomes dos pontos discrepantes. A coisa mais próxima que consegui encontrar durante a pesquisa aqui é o comando de anotação, mas isso parece criar um rótulo fixo no gráfico. Infelizmente, com o número de pontos que tenho, o gráfico de dispersão seria ilegível se eu rotulasse cada ponto. Alguém sabe como criar rótulos que só aparecem quando o cursor passa o mouse nas proximidades desse ponto?
python
matplotlib
jdmcbr
fonte
fonte
Respostas:
Parece que nenhuma das outras respostas aqui realmente responde à pergunta. Então, aqui está um código que usa uma dispersão e mostra uma anotação ao passar o mouse sobre os pontos de dispersão.
Como as pessoas também querem usar esta solução para uma linha em
plot
vez de uma dispersão, a seguinte seria a mesma solução paraplot
(que funciona de maneira um pouco diferente).Mostrar snippet de código
Caso alguém esteja procurando uma solução para linhas em eixos duplos, consulte Como fazer etiquetas aparecerem ao passar o mouse sobre um ponto em vários eixos?
Caso alguém esteja procurando uma solução para gráficos de barras, consulte, por exemplo, esta resposta .
fonte
ind["ind"]
na verdade é uma lista de índices para todos os pontos sob o cursor. Isso significa que o código acima realmente oferece acesso a todos os pontos em uma determinada posição, e não apenas ao ponto mais alto. Por exemplo, se você tiver dois pontos sobrepostos, o texto poderá ser lido1 2, B C
ou mesmo1 2 3, B C D
se você tiver três pontos sobrepostos.0 8, A I
(veja a figura ).fig.canvas.draw_idle()
muitas vezes (até muda o cursor para inativo). Eu o resolvi armazenando o índice anterior e verificando seind["ind"][0] == prev_ind
. Atualize somente se você mover de um ponto para outro (atualizar texto), parar de passar o mouse (tornar a anotação invisível) ou começar a passar o mouse (tornar a anotação visível). Com essa mudança, é muito mais limpo e eficiente.%matplotlib notebook
em um notebook IPython / Jupyter.Esta solução funciona ao passar o mouse sobre uma linha sem a necessidade de clicar nela:
fonte
matplotlib
...) - isso funciona comipython
/jupyter
notebooks? Também funciona quando há várias subparcelas? O que dizer de um gráfico de barras em vez de um gráfico de linhas?Em http://matplotlib.sourceforge.net/examples/event_handling/pick_event_demo.html :
fonte
print
declaração também deve usar parênteses para compatibilidade com python 3Uma ligeira edição em um exemplo fornecido em http://matplotlib.org/users/shell.html :
Isso traça uma trama em linha reta, como Sohaib estava perguntando
fonte
mpld3 resolva isso para mim. EDITAR (CÓDIGO ADICIONADO):
Você pode verificar este exemplo
fonte
TypeError: array([1.]) is not JSON serializable
.mplcursors trabalhou para mim. O mplcursors fornece anotação clicável para o matplotlib. É fortemente inspirado no mpldatacursor ( https://github.com/joferkington/mpldatacursor ), com uma API muito simplificada
fonte
matplotlib
tornar a cada 10 linhas a mesma cor, uma dor.mplcursors
resolve isso embora.As outras respostas não abordaram minha necessidade de mostrar corretamente as dicas de ferramentas em uma versão recente da figura in-line do matupotlib do Jupyter. Este funciona embora:
Levando a algo como a seguinte imagem ao passar por cima de um ponto com o mouse:
fonte
Se você usa o notebook jupyter, minha solução é simples:
Você pode obter algo como
fonte
Eu criei um sistema de anotação de várias linhas para adicionar a: https://stackoverflow.com/a/47166787/10302020 . para a versão mais atualizada: https://github.com/AidenBurgess/MultiAnnotationLineGraph
Simplesmente altere os dados na seção inferior.
fonte